我正在学习功能强大的软件,我需要一个人为我提供初步 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
}