Как я могу создать массив каталогов и файлов в PowerShell? - PullRequest
1 голос
/ 24 апреля 2020

Я знаю, что в PowerShell массив может быть создан следующим образом.

$myArray = "item1", "item2", "item3"

или с использованием другого синтаксиса.

$myfruits = @('Pineapple','Oranges','Bananas')

Мне нужно создать массив с именами каталогов и файл, найденный в скрипте root.

$myArray = folder1, folder2, folder3, myprogram.exe

Элементы в массиве являются фактическими именами папок и исполняемыми файлами без кавычек, поскольку они находятся в текущем каталоге (скрипт root). Это не работает с PowerShell, выдающим ошибку Missing argument in Parameter list. Что я делаю неправильно? Я на Windows 10 x64 использую PowerShell 7.0.

1 Ответ

1 голос
/ 24 апреля 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...