我正在学习功能强大的软件,我需要一个人为我提供初步 push 力,以帮助我度过学习曲线。我熟悉编程和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数组中,并打印出文件名。

最佳答案

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

08-27 00:27