Powershell - 关于foreach的澄清

use*_*746 4 powershell

我正在学习powershell,我需要有人给我一个初步的推动,让我通过学习曲线.我熟悉编程和dos但不熟悉PowerShell.

我想要做的是列出我指定目录中的所有文件并将文件名推送到数组中.我对语法不太熟悉,当我尝试运行测试时,我被问到输入参数.

有人可以赐教我,告诉我正确的方法来得到我想要的东西吗?

这就是PowerShell问我的问题:

PS D:\ABC> Test.ps1
cmdlet ForEach-Object at command pipeline position 2
Supply values for the following parameters:
Process[0]:
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

[string]$filePath = "D:\ABC\*.*";

Get-ChildItem $filePath | foreach
{
 $myFileList = $_.BaseName;
 write-host $_.BaseName
}
Run Code Online (Sandbox Code Playgroud)

为什么ps询问Process [0]?

我想ps来列出目录中的所有文件并将结果传递到foreach,我将每个文件放入$ myFileList数组并打印出文件名.

bri*_*ist 6

不要将foreach(语句)与ForEach-Object(cmdlet)混淆.微软确实有这种可怕的工作,因为有一个别名foreach指向ForEach-Object,因此当你使用foreach,你必须知道你正在使用基于你如何使用它的版本.他们的文档通过进一步将两者混为一谈而使情况更糟.

您尝试在代码中ForEach-Object使用的那个是,因此您应该使用它的全名来区分它.从那里,问题是该{块在下一行开始.

{}在PowerShell中用于与语句相关的代码块(如while循环),但也用于表示[ScriptBlock]对象.

当你使用ForEach-Object它时,期望一个可以在位置上进行的脚本块,但它必须在同一行上.

相反,既然foreach是声明,它可以{}在下一行使用它.

你的代码ForEach-Object:

Get-ChildItem $filePath | ForEach-Object {
 $myFileList = $_.BaseName;
 write-host $_.BaseName
}
Run Code Online (Sandbox Code Playgroud)

你的代码foreach:

$files = Get-ChildItem $filePath
foreach ($file in $Files)
{
 $myFileList = $file.BaseName;
 write-host $file.BaseName
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案.为了进一步澄清(或可能混淆)因为你在管道中使用了foreach,所以使用它作为foreach-object的别名而不是如所示的foreach语句.但正如Briantist所说,最好是明确地避免混淆 - 在管道中它始终是foreach-object(尽管它也有别名%). (2认同)