tl; dr
Чтобы определить литерал массива с строками , необходимо заключить в кавычки его элементы:
$myArray = 'folder1', 'folder2', 'folder3', 'myprogram.exe'
Синтаксис @(...)
для литералов массива должен быть , избегать . @(...)
не только не нужен, но и неэффективен в версиях PowerShell вплоть до 5.0, но, что более важно, он вызывает концептуальную путаницу, ложно полагая, что он создает массивы. Для получения дополнительной информации см. Нижний раздел этого ответа .
PowerShell имеет два основных режимов анализа :
аргумент режим , который работает как традиционные оболочки
- В режиме аргумента первый токен интерпретируется как имя команды (например, имя командлета, имя функции или имя файла исполняемого файла), , за которым следует список, разделенный пробелами из аргументов , которые могут быть без кавычек , если они не содержат ни пробела , ни метасимволов .
выражение mode , которое работает как традиционные языки программирования , где строки должны быть цитируется
Это первый токен (исключая LHS переменного назначения и =
) который определяет, какой режим применяется - см. этот ответ для получения дополнительной информации.
В следующем утверждении:
$myArray = folder1, folder2, folder3, myprogram.exe
folder1
, потому что это без кавычек и:
- не начинается с
$
или (
или @
- не является числовым литералом ,
триггеры аргумент режим; то есть folder1
интерпретируется как имя команды , что приводит к - несколько бесполезному - сообщению об ошибке, которое вы видели (вы можете вызвать его с помощью чего-то вроде Get-Date,
).
Поэтому, чтобы определить литерал массива с строками , необходимо заключить его элементы:
$myArray = 'folder1', 'folder2', 'folder3', 'myprogram.exe'
Обратите внимание, что - удобно, но неэффективно - альтернатива в режиме аргумента, которая избавляет вас от необходимости цитирования, будет выглядеть следующим образом:
$myArray = Write-Output folder1, folder2, folder3, myprogram.exe