将参数从批处理文件传递到PowerShell脚本


88

在我的批处理文件中,我这样调用PowerShell脚本:

powershell.exe "& "G:\Karan\PowerShell_Scripts\START_DEV.ps1"

现在,我想将字符串参数传递给START_DEV.ps1。假设参数是w=Dev

我怎样才能做到这一点?


1
该脚本需要命名参数还是匿名参数?
vonPryz 2011年

Answers:


139

假设您Dev要从批处理文件中将字符串作为参数传递:

powershell -command "G:\Karan\PowerShell_Scripts\START_DEV.ps1 Dev"

放在您的powershell脚本头中:

$w = $args[0]       # $w would be set to "Dev"

如果您想使用内置变量$args。除此以外:

 powershell -command "G:\Karan\PowerShell_Scripts\START_DEV.ps1 -Environment \"Dev\""

在您的powershell脚本头中:

param([string]$Environment)

如果需要命名参数,则使用此选项。

您可能还对返回错误级别感兴趣:

powershell -command "G:\Karan\PowerShell_Scripts\START_DEV.ps1 Dev; exit $LASTEXITCODE"

错误级别将在批处理文件中显示为%errorlevel%


23

假设您的脚本类似于下面的代码片段,名为testargs.ps1

param ([string]$w)
Write-Output $w

您可以在命令行中将其称为:

PowerShell.Exe -File C:\scripts\testargs.ps1 "Test String"

这将在控制台上打印“测试字符串”(不带引号)。“测试字符串”成为脚本中$ w的值。


13

加载脚本时,所有传递的参数都会自动加载到特殊变量中$args。您可以在脚本中引用它,而无需先声明它。

例如,创建一个名为的文件test.ps1,并将变量$args本身单独放在一行上。像这样调用脚本,将产生以下输出:

PowerShell.exe -File test.ps1 a b c "Easy as one, two, three"
a
b
c
Easy as one, two, three

作为一般建议,当直接通过调用PowerShell来调用脚本时,我建议使用该-File选项,而不是使用&- 隐式调用- 该选项可以使命令行更简洁,特别是在需要处理嵌套引号的情况下。


7

在ps1文件顶部添加参数声明

test.ps1

param(
  # Our preferred encoding
  [parameter(Mandatory=$false)]
  [ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")]
  [string]$Encoding = "UTF8"
)

write ("Encoding : {0}" -f $Encoding)

结果

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII

6

@Emiliano的回答非常好。您还可以像这样传递命名参数:

powershell.exe -Command 'G:\Karan\PowerShell_Scripts\START_DEV.ps1' -NamedParam1 "SomeDataA" -NamedParam2 "SomeData2"

注意,参数在命令调用之外,您将使用:

[parameter(Mandatory=$false)]
  [string]$NamedParam1,
[parameter(Mandatory=$false)]
  [string]$NamedParam2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.