PowerShell设置环境变量为子表达式丢弃换行符



我有一个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隐式地将数组字符串化,这意味着它将其元素与空格作为分隔符连接起来,因此行foobar变成具有逐字内容foo bar的字符串;也就是说,换行符被空格代替。

  • 通过使用-join操作符显式地将元素与(仅限限)换行符(通过可扩展的PowerShell字符串表示为"`n")连接在一起,可以预先构造一个显式的多行字符串,然后可以将其分配给环境变量。

最新更新