如何将参数或变量从一个PowerShell脚本传递到另一个?

时间:2014-11-04 09:43:18

标签: windows powershell batch-file cmd

在cmd中,我可以通过在声明要运行的bat文件之后列出它们将参数从一个bat传递到另一个bat。然后,待运行的球棒接收它们为%1,%2,%3等。这可以在Powershell中完成吗?

我有一个ps1脚本script1,它提示用户输入一个位置。该脚本已被处理。该位置存储为变量; $同上。在第一个脚本中,有一点是用户可以选择一个选项来运行另一个ps1脚本script2,它有更多的选项。我想将$ loc从script1传递给script2。

在script1中,我尝试了以下内容:

param ($loc)
start-process "\script2.ps1" -ArgumentList $loc
start-process "\script2.ps1" -$loc
start-process "\script2.ps1"

然后是脚本2

args[0]
$loc

我知道我可能只是不理解传递的论点。事情是另一个选项调用bat脚本。那个我使用-ArgumentList $ loc并且它传递那么好。我使用"设置loc =%1"

在bat脚本中选择该参数

3 个答案:

答案 0 :(得分:10)

您不需要Start-Process从另一个PowerShell脚本运行一个PowerShell脚本。只需使用您想要的任何参数调用第二个脚本:

# script1.ps1

$loc = Read-Host 'Enter location'

C:\path\to\script2.ps1 $loc 'other parameter'

在第二个脚本中,可以通过$args数组访问参数列表:

# script2.ps1

Write-Host $args[0]
Write-Host $args[1]

你也可以像这样定义命名参数:

# script2.ps1

Param($Location, $Foo)

Write-Host $Location
Write-Host $Foo

或(更完整)像这样:

# script2.ps1

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$true)]
  [string]$Location,
  [Parameter(Mandatory=$false)]
  [string]$Foo
)

Write-Host $Location
Write-Host $Foo

定义命名参数允许您传递参数而不必担心它们的顺序:

C:\path\to\script2.ps1 -Foo 'other parameter' -Location $loc

或自动拥有参数validated,而无需在函数体中实现检查:

# script2.ps1

Param(
  [ValidateSet('a', 'b', 'c')]
  [string]$Location,
  [ValidatePattern('^[a-z]+$')]
  [string]$Foo
)

Write-Host $Location
Write-Host $Foo

如果传递的参数多于定义的命名参数,那么这些附加参数将存储在$args数组中:

PS C:\> cat test.ps1
Param($Foo)

Write-Host $Foo
Write-Host $args[0]
PS C:\> .\test.ps1 'foo' 'bar'
foo
bar

有关详细信息,请参阅Get-Help about_Functions_Advanced_Parameters

答案 1 :(得分:1)

param ($loc)

在定义脚本参数的.ps1脚本的顶部,所以将其称为

  PathToMyScript\MyScript.ps1 -loc ValueOfLoc

所有attributes you can apply,包括在函数的[CmdletBinding()]语句中使用param,也适用于脚本。

答案 2 :(得分:-1)

Variables.ps1中声明的变量位于“脚本范围”。那就是你不能在声明它们的脚本范围之外看到它们。将Variables.ps1中的变量引入main.ps1范围的一种方法是“dot source”Variables.ps1。实际上,这在main.ps1的范围内运行Variables.ps1。要做到这一点,只需在调用脚本之前粘贴句点和空格:

. .\Variables.ps1
$var1
$var2