2016-02-11 87 views
0

下午好!Powershell - 創建寬表

我是一名試圖瞭解數據輸出如何工作的Powershell新手。我正在嘗試查找Active Directory中兩個用戶之間的差異。我找到了一個有效的解決方案(Compare-Object on two AD user accounts),但相關字段中的一些數據被截斷了......這沒有幫助。

我發現這似乎在此頁面的底部很優雅的解決方案:http://poshoholic.com/2010/11/11/powershell-quick-tip-creating-wide-tables-with-powershell/

我試圖將這兩個合併成一個單一的腳本。這是我有:

$user1 = get-aduser jdoe -Properties * 
$user2 = get-aduser jsmith -Properties * 

$Usercomparison = @() 

$user1.GetEnumerator() | ForEach-Object { 
    If ($User2.($_.Key) -eq $_.Value) 
    { 
     $Comparison = 'Equal' 
    } 
    else 
    { 
     $Comparison = 'Different' 
    } 

    $UserObj = New-Object PSObject -Property ([ordered]@{ 
     Property = $_.Key 
     User1 = $_.Value 
     User2 = $User2.($_.Key) 
     Comparison = $Comparison 
    }) 
    $UserComparison += $UserObj 
} 

$UserComparison 
| Format-Table -Property * -AutoSize ` 
| Out-String -Width 4096 ` 
| Out-File C:\Users\USER\Desktop\differences.txt 

這會產生一個錯誤,「一個空的管道元素是不允許的」。如果我刪除一行返回將第一個管道線$ UserComparison變量之後...

$UserComparison | Format-Table -Property * -AutoSize ` 
| Out-String -Width 4096 ` 
| Out-File C:\aliases.txt 

...然後將文本文件被創建,但它的格式錯誤。只有前兩列出現在輸出中,並且在右邊有大量浪費的空白,並且在每行後面有幾個空白行返回......沒有什麼像網站上的示例。

這是因爲我發現腳本中的數據寫入到一個變量,然後只打印變量在屏幕上,而不是使用一個命令,可以輸出正確的?我覺得我有我需要的所有部分,只是沒有以正確的配置獲得我想要的輸出。

謝謝!

+0

如果您只是s把它看出來,你可以嘗試'format-table -Property * -AutoSize | convertto-html c:\ myfile.html' –

+0

@TonyHinkle將HTML放入控制檯但未生成文件。 <!DOCTYPE html PUBLIC「 - // W3C // DTD XHTML 1.0 Strict // EN」「http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd」> HTML表

' 嘗試的情況下,多個位置,這是一個寫權限的問題。我是否正確使用了你的添加? '$ UserComparison | format-table -Property * -AutoSize | convertto-html c:\ myfile.html' –

+0

嘗試'$ UserComparison | ft -wrap | out-file c:\ temp \ test.txt'還有一些東西被截斷了,比如用戶所屬的所有組,但它可能會得到你所需要的。 –

回答

0

因此,#1線:

$UserComparison 
| Format-Table -Property * -AutoSize ` 
| Out-String -Width 4096 ` 
| Out-File C:\Users\USER\Desktop\differences.txt 

,因爲你是第一次執行

$UserComparison 

,其輸出的$UserComparison內容不工作。接下來,執行

| Format-Table -Property * -AutoSize ` 

哪些錯誤,因爲什麼被管道輸送到Format-Table。該「蜱」(`)在Format-Table語句的結尾是一個繼續行語句,即第二個版本:

$UserComparison | Format-Table -Property * -AutoSize ` 
| Out-String -Width 4096 ` 
| Out-File C:\aliases.txt 

是正確的,因爲它會被解釋爲一個巨大的線。

第二個問題,爲什麼你的問題的原因是因爲4096個字符是沒有足夠的空間來保存所有的,因此被截斷。請記住,-AutoSize將計算最長項目的寬度,並確定該列的寬度。有些項目太長了。例如。對我來說,thumbnailPhoto(正好是在我的陣列項目140):

$UserComparison[140] 

給出了這樣的事情(取決於寬度截斷):

Property  User1 
--------  ----- 
thumbnailPhoto {255 216 255 224 0 16 74 70 73 70 0 1 1 1 0 96 0... 

當我計算的這個寬度,它給我:

#Calculate width of User1 
($UserComparison[140].User1 | Out-String).Length 

7555 

#Calculate width of full field 
($UserComparison[140] | Out-String).Length 

12297 

是的,User1是7,555個字符長。這意味着,Format-Table -Autosize將使User1至少 7555個字符寬,這顯然是由您在Out-String指定,然後將不顯示User2Comparison列4096寬度限制截斷。在這種情況下,您的Out-String需要寬度至少爲12,297,才能顯示完整字段。

的解決方法是指定在該保證是更廣泛的一樣,說的Out-String一個更大的寬度,5所以您的代碼將是:

$UserComparison | Format-Table -Property * -AutoSize ` 
| Out-String -Width 50000 ` 
| Out-File C:\Users\USER\Desktop\differences.txt 

現在,缺點這樣做,讓是文本文件中的每一行將是最長項目的全部寬度,所以(在我的情況下)每行將是12,297個字符長。這使得閱讀變得更加困難。

輸出的東西其他方式將是:

限制的東西,只是顯示的屬性和比較列:

$UserComparison | Select Property, Comparison ` 
| Format-Table -Property * -AutoSize ` 
| Out-String -Width 4096 ` 
| Out-File SimpleCompare.txt 

或者,如果你需要看到什麼完整的值,斬每個屬性與ForEach對象放在一個單獨的表格中,然後傳遞它以便讀取,並且每個屬性都被限制爲它的特定寬度:

$UserComparison | Select Property, Comparison, User1, User2 ` 
| ForEach-Object { $_ | Format-Table -Property * -AutoSize ` 
| Out-String -Width 50000 ` 
| Out-File EasyToRead.txt -Append }