Подтвердить что ты не робот

Powershell: Как передать переменные для переключения параметров при вызове powershell в командной строке?

Обычно, если вы хотите отложить спецификацию параметра коммутатора к некоторой переменной, вы можете передать выражение параметру switch, как показано в параметре WhatIf.

test.ps1

param ( [string] $source, [string] $dest, [switch] $test )
Copy-Item -Path $source -Destination $dest -WhatIf:$test

Это дает вам большую гибкость при работе с коммутаторами. Однако, когда вы вызываете powershell с cmd.exe или чем-то, вы завершаете что-то вроде этого:

D:\test>powershell -file test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true

D:\test\test.ps1 : Cannot process argument transformation on
parameter 'test'. Cannot convert value "System.String" to type "System.Manageme
nt.Automation.SwitchParameter", parameters of this type only accept booleans or
 numbers, use $true, $false, 1 or 0 instead.
At line:0 char:1
+  <<<<
    + CategoryInfo          : InvalidData: (:) [test.ps1], ParentContainsError
   RecordException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1

Однако тот же результат появляется при передаче -test:true и -test:1. Почему это не работает? Должна ли система преобразования типа Powershell автоматически распознавать эти строки как конвертируемые в bool или switch и преобразовывать их?

Означает ли это, что при вызове сценариев powershell из какой-либо другой системы (например, системы сборки) необходимо построить сложные структуры управления потоком, чтобы определить, включать ли в командную строку коммутатор или опустить его? Это кажется утомительным и подверженным ошибкам, что заставляет меня думать, что это не так.

4b9b3361

Ответ 1

Это поведение было зарегистрировано как ошибка connect. Это обходное решение:

powershell ./test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true

Ответ 2

Используйте свойство IsPresent коммутатора. Пример:

function test-switch{
param([switch]$test)
  function inner{
    param([switch]$inner_test)
    write-host $inner_test
  }
  inner -inner_test:$test.IsPresent
}
test-switch -test:$true
test-switch -test
test-switch -test:$false

True
True
False

Кстати, я использовал функции, а не script, поэтому было бы легче протестировать.