Как указать параметр switch при вызове скрипта из командного файла - PullRequest
1 голос
/ 11 июня 2019

У меня есть сценарий foo.ps1 и командный файл foo.cmd, используемый для запуска сценария двойным щелчком по файлу cmd в проводнике.

Сценарий принимает параметр switch, но я незнать, как предоставить такой параметр.Простые параметры в порядке.

Foo.ps1:

param(
    [Parameter()]
    [Switch]$MySwitch,
    [Parameter()]
    [string]$Name
)

Write-Host "`$MySwitch : $MySwitch, `$Name : $name"

Foo.cmd:

Powershell -noprofile -NonInteractive -file "%~dp0\foo.ps1" -Name "abc"    

Если я вызываю сценарий только с именем, он работает,Но если я укажу MySwitch, он перестанет работать:

Foo2.cmd:

Powershell -noprofile -NonInteractive -File "%~dp0\foo.ps1" -Name "abc" -MySwitch:$false

Ошибка:

C:\temp\foo.ps1 : Impossible de traiter la transformation d'argument sur le paramètre «MySwitch». Impossible de convertir la valeur «System.String» en type « System.Management.Automation.SwitchParameter». Les paramètres booléens acceptent seulement des valeurs booléennes et des nombres, tels que $True, $False, 1 ou 0.
    + CategoryInfo          : InvalidData : (:) [foo.ps1], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,foo.ps1

1 Ответ

1 голос
/ 12 июня 2019

В Windows PowerShell невозможно передать логическое значение, когда параметр CLI -File используется - с тех пор это исправлено в PowerShell Core [1] .

Используйте обходной путь , который JosefZ рекомендует:

Использование -Command (-c) вместо -File заставляет PowerShell обрабатывать аргументы как исходный код PowerShell , а не как буквальные аргументы , в этом случае $false правильно распознается (другие параметры CLI для краткости опущены).

powershell -c "& \"%~dp0\foo.ps1\" -Name 'abc' -MySwitch:$false"  

Обратите внимание на необходимость использования & для вызова файла сценария, поскольку его путь указан в кавычках.Также обратите внимание, что PowerShell ожидает встроенные символы ".в командной строке экранировать как \" (не как `" или "", как это работает внутри PowerShell).


PowerShell Coreподдерживает следующие значения в качестве логических значений при использовании -File: $true, $false, true, false (а также $null, но его интерпретация отличается: сценарии (в том числе с -File) и функцииинтерпретировать его как $false, тогда как командлеты интерпретируют его как $true (!)).
Обратите внимание, что с -Command - и, следовательно, во всем коде PowerShell - true и false, не not работают, но 0 и 1 делают.
К сожалению, если вы передаете неподдерживаемое значение, вы получаете одно и то же сообщение об ошибке во всех сценариях, что в сценарии -File вводит в заблуждение, что 0 и1 работа тоже.

...