如何在PowerShell中创建目录和文件数组?

如何在PowerShell中创建目录和文件数组?,powershell,Powershell,我知道在PowerShell中可以按如下方式创建阵列 $myArray = "item1", "item2", "item3" 或者使用另一种语法 $myfruits = @('Pineapple','Oranges','Bananas') 我需要创建一个数组,其中包含目录名和在脚本根目录中找到的文件 $myArray = folder1, folder2, folder3, myprogram.exe 数组中的项目是文件夹的实际名称,以及在当前目录(脚本根目录)中找到的不带引号的可执行文

我知道在PowerShell中可以按如下方式创建阵列

$myArray = "item1", "item2", "item3"
或者使用另一种语法

$myfruits = @('Pineapple','Oranges','Bananas')
我需要创建一个数组,其中包含目录名和在脚本根目录中找到的文件

$myArray = folder1, folder2, folder3, myprogram.exe
数组中的项目是文件夹的实际名称,以及在当前目录(脚本根目录)中找到的不带引号的可执行文件。这不适用于PowerShell在参数列表中给出错误
缺少参数的情况。
我做错了什么?我在使用PowerShell 7.0的Windows 10 x64上。

tl;dr

要使用字符串定义数组文字,必须引用其元素:

$myArray = 'folder1', 'folder2', 'folder3', 'myprogram.exe'
$myArray = 'folder1', 'folder2', 'folder3', 'myprogram.exe'
应避免使用数组文字的语法
@(…)
。这不仅是不必要的,
@(…)
,而且在5.0之前的PowerShell版本中效率低下,更重要的是,它错误地建议它构造数组,从而导致概念上的混乱。有关详细信息,请参见的底部部分


PowerShell有两种基本解析模式:

  • 参数模式,与传统shell类似

    • 在参数模式下,第一个标记被解释为命令名(例如cmdlet名称、函数名或可执行文件名),后跟以空格分隔的参数列表,如果这些参数既不包含空格,也不包含shell元字符,则可以不加引号
  • 表达式模式,与传统编程语言类似,其中必须引用字符串

它是决定应用哪种模式的第一个标记(不包括变量赋值的LHS和
=
-有关更多信息,请参阅

在以下声明中:

$myArray = folder1, folder2, folder3, myprogram.exe
folder1
,因为它是不带引号的,并且:

  • 不以
    $
    开头(
    @
  • 不是一个数字文字
触发器参数模式;也就是说,
folder1
被解释为一个命令的名称,这会导致您看到的错误消息(您也可以使用类似于
Get Date,
的命令来触发它)

因此,要使用字符串定义数组文字,必须引用其元素:

$myArray = 'folder1', 'folder2', 'folder3', 'myprogram.exe'
$myArray = 'folder1', 'folder2', 'folder3', 'myprogram.exe'
请注意,一个方便但低效的参数模式替代方案可以让您省去引用的工作,它如下所示:

$myArray = Write-Output folder1, folder2, folder3, myprogram.exe