2014-09-30 55 views
0

我是PowerShell的新手,並且偶然發現了一些行爲,我無法在嘗試做相當簡單的事情時做出解釋。我在文件系統中有幾個包含路徑的變量,我想確保它們都有尾部斜槓(如果它們丟失,則添加它們)。內聯初始化數組的迭代?

# append trailing slash if not present 
$engineXCopyPath, $engineXBackupPath, $enlistmentBuildTargetPath | ForEach-Object 
{ 
    Write-Host "hi" #where I would check the last character and add a \ if it weren't 
} 

當運行我的腳本,該代碼保持提示Process[_n_],直到我給它沒有輸入,在這種情況下,打印行的全部內容,而不是執行它。

據我所知,它應該迭代到三個項目餵給它,打印「嗨」每一個。我不確定爲什麼它會提示輸入任何內容(更不用說爲什麼它會停止輸入),也不知道它爲什麼要打印"Write-Host "hi" #where I would check the last character and add a \ if it weren't"而不是僅打印"hi"

感謝您的幫助!

回答

2

您需要包括在同一行的foreach對象左括號:

$engineXCopyPath, $engineXBackupPath, $enlistmentBuildTargetPath | ForEach-Object { 
    Write-Host "hi" #where I would check the last character and add a \ if it weren't 
} 

否則,PowerShell是提示你所需要的ForEach-ObjectProcess輸入scriptblocks。然後它將大括號解釋爲ScriptBlock的創建並打印內容。

+0

噢,夥計。我是一個「下一線支架」有點兒。謝謝。 – Benjin 2014-10-01 00:11:18

+0

@Benjin - 爲了澄清,Foreach-Object是一個Cmdlet。您傳入的腳本塊只是一個位置參數。您無法在下一行繼續執行命令的參數。一個使用命名參數的例子:'1,2,3 | Foreach-Object -begin {$ x = 2} -Process {$ x * $ _}'。 Foreach(){}是一個關鍵字。爲此,您可以在下一行開始捲曲。 – 2014-10-01 00:53:44

+0

我想我明白了。因此,通過在同一行上啓動開放大括號,Cmdlet知道我傳遞了一個參數,並且知道該參數將繼續,直到它碰到適當的大括號? – Benjin 2014-10-01 18:38:29