从powershell 1导出字符串到powershell 2



我有一个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

现在我们已经添加了PositionValueFromPipeline标志,我们可以通过管道,通过名称或位置一次性传递字符串:

# 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帮助主题

相关内容

  • 没有找到相关文章

最新更新