2016-11-08 28 views
3

我在寫一個檢查目錄是否存在的小腳本,如果它們存在,就刪除它們。我想有信息輸出,因此我要輸出時,將文件夾刪除的確認:在Powershell中沒有換行符的寫輸出?

Deleting C:\wherever\folder1... 
Done 
Deleting C:\wherever\folder2... 
Done 

雖然我的目標爲:

foreach ($e in $directoriesToRemove) 
    { 
     Write-Output "Deleting $e`..." 
     Remove-Item $e -recurse 
     Write-Output "Done" 
    } 

這之中的輸出

Deleting C:\wherever\folder1... Done 
Deleting C:\wherever\folder2... Done 

我知道Write-Host可以用-nonewline參數來實現,但是我希望儘可能避免使用Write-Host。

除了等待文件夾正在刪除並一次寫入整行以外,是否有解決方法? 我發現,這行工作,但我不知道,如果把刪除命令一個寫命令的輸出裏面是安全/最佳實踐:

Write-Output "Deleting $e`... $(Remove-Item $e -recurse) Done" 
+2

不,AFAIK。另外,在執行* write-output之前,將命令放入內部將簡單地評估它*。 – wOxxOm

回答

2

這裏是區別兩個cmdlet之間

Write-Output當你想創建一個對象來發送管道中的數據時,應該使用Write-Output,但不一定要在屏幕上顯示它。如果沒有別的東西首先使用它,管道將最終將其寫入out-default。

Write-Host當您想要做相反的事情時應該使用。 [console] :: WriteLine本質上是Write-Host在後臺執行的操作

根據我的理解,您所要求的可以翻譯爲試圖在管道中連接兩個字符串,但可以這樣做,但爲什麼不使用Write在這裏?

$(foreach ($a in $animals){Write-Output "buying a $a"; Write-Output " ... done"}) | % {$action="";$i=0}{if(($i%2) -eq 0){$action=$_}else{Write-Output "$action $_"};$i++}