2009-10-20 30 views
1

我經常想處理導致修改後的輸出文件的文件。我似乎無法找到PowerShell的方式做到這一點 - 它總是結束了在一襯墊,IYSWIM看起來像代碼。這是一個例子。PowerShell查詢:如何處理文件

我有一個LMHOSTS文件。不要問爲什麼!我想獲得一個只包含響應ping的服務器的新LMHOSTS文件。我也想通過任何評論線。

評論行以#開頭。

數據線這樣的事情(用空格隔開):

10.123.177.1 SVRDS1 #PRE #DOM:DOM1 

或本:

10.241.177.30 SVRDS30 #PRE 

這是我有什麼(與感謝Luke與劉炳章幫助主機):

gc 'C:\work\lmhosts.txt' | % { if ($_ -like '#*') { $_ | out-file 'C:\work\lmhosts2.txt' -append } else { if ($(Ping-Host $_.Substring(0, $_.indexof(' ')) -count 1 -timeout 10).received -eq 1) { $_ | out-file 'C:\work\lmhosts2.txt' -append } } } 

它的工作原理,但它不是很好。我採取了程序員的方法,但是將其作爲一行代碼來完成。有沒有更好的方式來做到這一點,這是更'殼'和更少'代碼'?

+2

小心使用類似。我會使用-match'^ \ s *#'來代替。如果有一個初始空間,類似的語句將無法捕捉它。 – 2009-10-20 17:26:34

+0

感謝您的發現。 – serialhobbyist 2009-10-21 17:44:09

回答

3

在此特定示例中,您正在過濾1個文件的內容並將其輸出到另一個文件。 Where-Object通常是一個很好的選擇。然後,您可以簡化您的一行位:

gc 'C:\work\lmhosts.txt' | 
    ?{ ($_ -like '#*') -or 
     ($(Ping-Host $_.Split(' ')[0]) -count 1 -timeout 10).received -eq 1) } > 
    'C:\work\lmhosts2.txt' 

一些注意事項: 「?」

  • 是Where-Object的別名
  • -or運算符會短路,即如果第一個操作數導致True,則第二個操作符不會執行。
  • 您可以使用重定向運算符「>」代替「| Out-File」。
  • 我用Split取代了Substring,它看起來稍微簡單一些,不確定是否與你的輸入一般工作。
+1

我喜歡這種方法。如果你使用PowerShell 2.0,我只需用Test-Connection -quiet替換Ping-Host的用法。順便說一句,如果你想保持原始編碼,我會退回到Out-File -enc ascii。 – 2009-10-20 17:31:41

+0

噢,大概的樣,因爲我對這個問題帖子中提到的脆性與-match相同意見。 – 2009-10-20 17:32:22

+0

啊,是的。這看起來比我的好。非常感謝。 – serialhobbyist 2009-10-21 17:49:12

1

空白是你的朋友!在Powershell腳本中,我寫的並不是立即拋出,幾乎每個'|'之後是換行符+縮進。

+1

啊,但那不會是單線。 :-) – serialhobbyist 2009-10-20 16:04:37

+0

好吧,我想我誤解了什麼樣的「風格」你希望能改進。 – 2009-10-20 17:41:43