我正在学习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数组并打印出文件名。
答案 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
}