我有一个python脚本:
# temp.py
print("foonbar")
我可以在powershell中运行:
> python .temp.py
foo
bar
我想把环境变量FOO
设置为这个python脚本的输出。但是,这样做会将换行符更改为空格:
> $env:FOO=$(python .temp.py)
> $env:FOO
foo bar
What I've try
验证环境变量可以包含换行符:
> echo "foo`nbar"
foo
bar
> $env:FOO2=$(echo "foo`nbar")
> $env:FOO2
foo
bar
…所以这个问题似乎与python脚本的执行有关?
验证子表达式操作符$()
没有修改python脚本输出:
> $(python .temp.py)
foo
bar
echo
显示python脚本的输出似乎表现出相同的行为:
> echo "$(python .temp.py)"
foo bar
…但如果我排除引号,则不会:
> echo $(python .temp.py)
foo
bar
解决方案
Base64编码的字符串绕过了这个问题。然而,我仍然想知道是什么导致了这一点?
我的powershell版本是5.1.22621.963
使用如下:
$env:FOO = (python .temp.py) -join "`n"
PowerShell报告来自外部程序的标准输出,如
python
逐行,当通过$(...)
或(...)
捕获时,结果为数组行(用于两行或多行)。如果您尝试将结果按原样赋值给环境变量-这总是字符串类型- PowerShell隐式地将数组字符串化,这意味着它将其元素与空格作为分隔符连接起来,因此行
foo
和bar
变成具有逐字内容foo bar
的字符串;也就是说,换行符被空格代替。通过使用
-join
操作符显式地将元素与(仅限限)换行符(通过可扩展的PowerShell字符串表示为"`n"
)连接在一起,可以预先构造一个显式的多行字符串,然后可以将其分配给环境变量。