我有一个shell脚本文件。
./1.ps1
./2.ps1
UPDATE:我在
1.ps1
中生成一个字符串,如env-0
,需要将其导出到2.ps1
。1。ps1生成了许多字符串,我无法将我的env-0作为参数传递给2.ps1
。
你有别的解决办法吗?
PowerShell的流式I/O模型有点不寻常,但是任何未捕获的值基本上都是输出—因此要从1.ps1
输出字符串env-0
,这就是您所需要的:
"env-0"
现在1.ps1
输出一个字符串值,我们需要某种方法将它提供给2.ps1
。
您可以依赖未绑定的位置参数,它将通过$args
变量在目标脚本/函数中自动可用:
# 2.ps1
$envString = $args[0]
# work with your `$envString` value here
调用:
$envString = ./1.ps1
./2.ps1 $envString
# or
./2.ps1 $(./1.ps1)
您还可以通过使用$input
自动输入枚举变量来接受管道输入:
# 2.ps1
$input |ForEach-Object {
$envString = $_
# work with your `$envString` value here
}
调用:
./1.ps1 |./2.ps1
如果您打算连续向2.ps1
提供多个输入,这可能很有用:
# This will execute `./1.ps1` 100 times, but `./2.ps1` will only be executed once, and the output continuously fed to it as pipeline input
1..100 |ForEach-Object { ./1.ps1 } | ./2.ps1
最后,如果您想为更高级的场景(多个输入参数,输入验证,参数完成等)编写脚本,您将需要使用param()
块显式声明命名参数:
# ./2.ps1
param(
[Parameter(Mandatory)]
[string]$Environment
)
# work with $Environment here
调用:
./2.ps1 -Environment $(./1.ps1)
值得注意的是,您可以使用[Parameter()]
属性来修改绑定行为,这样您仍然可以获得管道支持:
# ./2.ps1
param(
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
[string]$Environment
)
# work with $Environment here
现在我们已经添加了Position
和ValueFromPipeline
标志,我们可以通过管道,通过名称或位置一次性传递字符串:
# These all work now
./2.ps1 -Environment $(./1.ps1)
./2.ps1 $(./1.ps1)
./1.ps1 |./2.ps1
唯一需要注意的是,您不能再用管道将多个输入值输入到中—为此,您需要将脚本主体移动到一个特殊的process
块中:
# ./2.ps1
param(
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
[string]$Environment
)
process {
# work with $Environment here
}
process
块对于每个管道输入只执行一次,所以现在管道多个值再次工作()以及前面的3个示例:
1..100 |ForEach-Object { ./1.ps1 } | ./2.ps1
这就是我的解决方案:
# 1.ps1
"env-0"
# 2.ps1
# ./2.ps1
param(
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
[string]$Environment
)
process {
# work with $Environment here
}
有关高级参数及其绑定语义以及如何使用它们的更多信息,请参阅about_Functions_Advanced_Parameters
帮助主题