Powershell удаляет запятую из аргумента программы

Я хочу передать список разделенных запятыми значений в script как часть одного коммутатора.

Вот программа.

param(
  [string]$foo
)

Write-Host "[$foo]"

Вот пример использования

PS> .\inputTest.ps1 -foo one,two,three

Я ожидал бы, что выход этой программы будет "[один, два, три]", но вместо этого он возвращает "[один два три]". Это проблема, потому что я хочу использовать запятые для разграничения значений.

Почему powershell удаляет запятые и что мне нужно изменить, чтобы их сохранить?

Ответ 1

Запятая представляет собой специальный символ в powershell для обозначения разделителя массива.

Просто поставьте аргументы в кавычки:

inputTest.ps1 -foo "one, two, three"

В качестве альтернативы вы можете "процитировать" запятую:

inputTest.ps1 -foo one`,two`,three

Ответ 2

Вставьте его в кавычки, чтобы он интерпретировал его как одну переменную, а не список из трех:

PS > .\inputTest.ps1 -foo "один, два, три"

Ответ 3

Доступны следующие варианты

  • Цитаты вокруг всех аргументов (')

    inputTest.ps1 -foo 'one,two,three'

  • Символ escape-символов Powershell перед каждой запятой (grave-accent (`))

    inputTest.ps1 -foo one`,two`,three

Двойные кавычки вокруг аргументов ничего не меняют!
Одиночные кавычки устраняют расширение.
Символ Escape (серьезный акцент) исключает расширение следующего символа

Ответ 4

если вы передаете параметры из пакетного файла, а затем введите ваши параметры, как показано ниже "" Param1, Param2, Param3, Param4 "" "