在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脚本中选择该参数答案 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