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

use*_*627 6 windows powershell cmd batch-file

在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"
Run Code Online (Sandbox Code Playgroud)

然后是脚本2

args[0]
$loc
Run Code Online (Sandbox Code Playgroud)

我知道我可能只是不理解传递的论点.事情是另一个选项调用bat脚本.那个我使用-ArgumentList $ loc并且它传递那么好.我使用"Set loc =%1"在bat脚本中选择了这个参数

Ans*_*ers 14

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

# script1.ps1

$loc = Read-Host 'Enter location'

C:\path\to\script2.ps1 $loc 'other parameter'
Run Code Online (Sandbox Code Playgroud)

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

# script2.ps1

Write-Host $args[0]
Write-Host $args[1]
Run Code Online (Sandbox Code Playgroud)

您还可以像这样定义命名参数:

# script2.ps1

Param($Location, $Foo)

Write-Host $Location
Write-Host $Foo
Run Code Online (Sandbox Code Playgroud)

或者(更完整)像这样:

# script2.ps1

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

Write-Host $Location
Write-Host $Foo
Run Code Online (Sandbox Code Playgroud)

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

C:\path\to\script2.ps1 -Foo 'other parameter' -Location $loc
Run Code Online (Sandbox Code Playgroud)

或者在不必在函数体中实现检查的情况下自动验证参数:

# script2.ps1

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

Write-Host $Location
Write-Host $Foo
Run Code Online (Sandbox Code Playgroud)

如果传递的参数多于定义的命名参数,那么这些附加参数将存储在$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.


小智 3

Variables.ps1 中声明的变量位于“脚本作用域”。也就是说,您无法在声明它们的脚本范围之外看到它们。将 Variables.ps1 中的变量引入 main.ps1 范围的一种方法是“点源”Variables.ps1。实际上,这在 main.ps1 的范围内运行 Variables.ps1。为此,只需在调用脚本之前添加句点和空格即可:

. .\Variables.ps1
$var1
$var2
Run Code Online (Sandbox Code Playgroud)