Powershell - 关于foreach的澄清

时间:2017-04-26 20:21:22

标签: 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]:

这是我的测试:

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

Get-ChildItem $filePath | foreach
{
 $myFileList = $_.BaseName;
 write-host $_.BaseName
}

为什么ps询问Process [0]?

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

1 个答案:

答案 0 :(得分:5)

不要将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
}

您的代码foreach

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