2013-03-22 33 views
0

我想編寫一個像Out-String一樣運行的PowerShell cmdlet腳本,但它的行寬無限制,並且在行末尾沒有任何填充以指定寬度。如何編寫類似Out-String的cmdlet?

它應該具有如下代碼的輸出,但最好不會有最大行寬,並且任何實際在輸入中的行的末尾空白都將被保留。

$x = ls; 
[regex]::Replace(($x| Out-String -Width 1024), "\ +([\r\n])", '$1'); 

(如果您直接打印$x | Out-String -Width 1024,你可以看到多餘的空格在線條的末端。)

+0

這是爲什麼需要時即可只需輸出一個字符串? – 2013-03-22 14:14:54

+0

因爲寬度是1024,所以還有額外的空間。擺脫寬度參數和額外的空間會消失。使用PowerShell,您不需要動態分配數組。也沒有這種東西無限的字符串。 「爲什麼需要這樣做,只要輸出一個字符串?」 – 2013-03-22 22:49:52

+0

默認寬度爲80,因此將它關閉會讓事情變得更糟。 – 2013-03-23 11:58:00

回答

1

您可以輕鬆創建一個「沒有多餘的裝飾」實施Out-String的東西,如:

filter ConvertTo-String { "$_" } 

這脅迫傳遞給過濾器轉換成字符串(使用PowerShell的字符串擴展調用ToString在非空的對象,並改變$null到一個空字符串)的任何對象。

下面五行的示例輸入運行過濾器,過濾器將它們轉換成相應的字符串的值(整數變得'1',雙'2.3',空'',字符串'four',和哈希表'System.Collections.Hashtable'):

1,2.3,$null,'four',@{five=6} | ConvertTo-String 


運行於的Get-ChildItem(別名ls)的輸出處的濾波器產生類似的結果:

PS> Get-ChildItem 

    Directory: C:\Windows\System32\WindowsPowerShell\v1.0 

Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
d----  13 Jul 2009 11:56 PM   en-US 
d----  13 Jul 2009 11:52 PM   Examples 
d----  13 Jul 2009 11:52 PM   Modules 
-a---  13 Jul 2009 8:14 PM  452608 powershell.exe 
-a---  12 May 2012 10:28 AM  436 powershell.exe.config 
... 

PS> Get-ChildItem | ConvertTo-String 
en-US 
Examples 
Modules 
powershell.exe 
powershell.exe.config 
... 


當您將對象轉換成字符串,就失去了原本的對象包含的信息和功能:

  • 轉換一個哈希表爲一個字符串只是給你它的類型名稱。您不能訪問散列表的Count,或者瞭解其元素的任何內容。
  • 將文件系統對象轉換爲字符串會爲您提供請求的相對路徑。您不能訪問該項目的full path,得到LastWriteTime,確定文件項目的Length,甚至測試項目是否一個文件或目錄(未做其他調用)。

事實上,可以作出的唯一安全的轉換是,如果原來的對象一個字符串。這也是唯一一次會出現「尾隨空白」。

(換句話說,它通常是更好的做法,堅持,只要有可能,而不是試圖仿效基於字符串的炮彈;-)的限制對象

相關問題