2014-09-30 54 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