powershell передает аргументы командной строки

вот мой код :

$script={
 Write-Host "Num Args:" $args.Length;
  Write-Host $args[0]   
}

Invoke-Command  -ScriptBlock $script

когда я запускаю

  powershell.exe .test.ps1 one two three

Я получил

Num Args: 0

Я думал, что получу

Num Args: 3
One

что-то я упускаю?

спасибо

3 ответов


у вас на самом деле есть две области. Уровень сценария и уровень блока сценария. $args.Length и $args[0] будет то, что вы ожидаете в


вам нужно передать аргументы в scriptblock:

Invoke-Command  -ScriptBlock $script -ArgumentList $args 

вы также можете явно объявить именованные параметры. Например:

param([switch]$someBoolSwitch=$false, [String]$nameOfSomething="some default string")

это позволяет передавать именованные аргументы в скрипт, как в следующем примере:

.\<nameOfScript.ps1> -someBoolSwitch -nameOfSomething "Slayer Roolz!"

и если вы опустили -nameOfSomething "Slayer Roolz!", потом $nameOfSomething просто по умолчанию "some default sting". Аналогично,$someBoolSwitch по умолчанию $false если не определено иначе.

этот метод имеет преимущество, позволяя вам как разработчику решать, какие параметры необходимы и какие из них могут быть опущены или по умолчанию. Кроме того, он позволяет пользователю вводить аргументы в любом порядке, поскольку они называются, а не позиционные.

одним из недостатков именованных параметров в отличие от позиционных параметров является то, что вызов командной строки может стать довольно большим, поскольку пользователь должен ввести имя каждого параметра.