2014-03-25 71 views
0

我是Powershell的新手,我想知道爲什麼這個功能不能按照我的需要工作。以下函數在指定的計算機的hosts文件中取消註釋行。它很棒!但我希望能夠使用Write-Output將每行輸出到屏幕並獲取變量並將其存儲在另一個數組中。這個寫輸出不做任何事情,我不能將它添加到數組中。爲什麼?上面的寫輸出工作得很好。寫入輸出失敗內部Foreach循環 - Powershell

function UnCommentHostsFile($ip){ 

    Write-Output "This Write-Output Works!" 

    $hosts = $hosts | Foreach { 

     #This part of the function works great! 
     if ($_ -match $regex + $ip){ 
      $_.replace("#", "") 

      #This is where I want to add it to an array and write-output but I can't. 
     } 
     else { 
      $_ 
     } 

     #This does not output! 
     Write-Output $_ 
    } 
} 

任何幫助將不勝感激!謝謝! :)

回答

1

要回答你的問題,如果你這樣做:

$hosts = $hosts | Foreach {...} 

一切,是輸出到foreach腳本塊內的管道是會得到重新定向到變量$hosts

Write-Output寫入管道,並且您正在該腳本塊中執行該操作。

如果要明確寫入屏幕,請使用Write-HostWrite-Verbose

+0

這沒有奏效。我嘗試了寫主機,寫輸出和寫詳細。沒有任何內容正在輸出到屏幕上,但它仍然正確地寫入文件。 –

+0

而結果是? – mjolinor

+0

沒什麼。這三種情況中的任何一種都不會寫入屏幕。如果將Write語句放在if語句中,它不會運行。如果我在這裏放置寫主機,我的原始寫輸出是打印出文件中的每一行。我只想要改變的線條。 –

0

你不需要寫輸出。把它作爲一個對象,並且你可以格式化那個對象,但是你想在這個函數之外。我對它進行了更新,以便對於每一行,如果它與你的正則表達式匹配,它就會像你已經擁有的那樣替換掉沒有的東西,但是我刪除了Else子句,因爲它沒有意義。我將$_.replace("#", "")更改爲$_ = $_.replace("#", ""),以便它實際更新$ Hosts中的行,而不是僅回顯它。然後,當所有的說法和完成後,它輸出整個$主機更新行和所有。

function UnCommentHostsFile($ip){ 

    $hosts = $hosts | Foreach { 

     #This part of the function works great! 
     if ($_ -match $regex + $ip){ 
      $_ = $_.replace("#", "") 

      #This is where I want to add it to an array and write-output but I can't. 
     } 

     #This does not output! 
    } 
    $Hosts 
} 

編輯:當你調用函數時,它應該吐出$ Hosts中的任何東西,所以它應該輸出到屏幕上。不需要寫輸出或任何東西。它會顯示在屏幕上供用戶使用,除非您將輸出重定向到某種東西,在這種情況下,只需在將管道打印到屏幕上的管道上添加一點即可。

+0

我需要寫入屏幕,一些非技術人員將使用此腳本,並將其保存到一個數組,以便對特定條目執行操作。 $ _。replace(「#」,「」)工作得很好,你的代碼也可以工作。 –