Powershell 用单个可扩展字符串调用回音意外导致中间输出换行。

Powershell 用单个可扩展字符串调用回音意外导致中间输出换行。,powershell,Powershell,我有以下PowerShell脚本 $var = 'abcd' echo $($var):123:zzz > test.txt 执行后,test.txt的内容变为 如何避免在abcd之后换行 我的意思是我希望test.txt的内容是 如何执行此操作?echo是写入输出cmdlet的别名,此处根本不需要它。只需将所需的输出放入管道并将其输送到Set Contentcmdlet: "$($var):123:zzz" | Set-Content -Path 'test.txt' -Encodin

我有以下PowerShell脚本

$var = 'abcd'
echo $($var):123:zzz > test.txt
执行后,test.txt的内容变为

如何避免在
abcd
之后换行

我的意思是我希望test.txt的内容是

如何执行此操作?

echo
写入输出
cmdlet的别名,此处根本不需要它。只需将所需的输出放入管道并将其输送到
Set Content
cmdlet:

"$($var):123:zzz" | Set-Content -Path 'test.txt' -Encoding Unicode
"anotherLine" | Add-Content test.txt -Encoding Unicode
现在,如果要向文件追加另一个字符串,请使用
添加内容
cmdlet:

"$($var):123:zzz" | Set-Content -Path 'test.txt' -Encoding Unicode
"anotherLine" | Add-Content test.txt -Encoding Unicode
如果您试图在$var的末尾添加“:123:zzz”,您也可以这样做

$var = 'abcd'
echo ($var+':123:zzz') > test.txt
或者,如果要添加新行(追加),请添加第二个“>”

用一种更可取的解决方案绕过您的问题(无需
写入输出
a.k.a
echo
)。
这个答案解释了您的方法的问题

tl;dr

  • 使用双引号:

    • echo“$($var):123:zzz”>test.txt
  • 简化(无需
    echo
    ):

    • “$($var):123:zzz”>test.txt
  • 最简单的(注意
    {}
    ,这是消除变量名歧义所必需的):

    • “${var}:123:zzz”>test.txt
    • “$var`:123:zzz”>test.txt也可以工作(转义

您的具体问题是,
$($var):123:zzz
被解析为两个参数,因为没有包含在

换句话说:以下两条语句是等效的:

echo $($var):123:zzz

echo $($var) :123:zzz    
两者都会产生以下结果(无论是在控制台中还是重定向到文件时),因为
写入输出
(即
echo
是的别名)写入其(字符串化的)参数,并用换行符分隔:

abcd
:123:zzz
由于要将
$($var):123:zzz
作为参数传递给
echo
Write Output
)命令,因此将在中对其进行解析

在参数模式中,标记开头的未加引号的子表达式运算符表达式(如
$($var)
)始终被视为单独的参数,即使后面直接跟有更多字符

我的同事有更多关于PowerShell如何在参数模式下解析无引号标记的信息。

相比之下,双引号(将标记括在
“…”
)可确保将解析作为单个参数(但请注意,子表达式将首先进行字符串化)

因此,该命令将起作用:

echo "$($var):123:zzz" > test.txt
或者,更简单地说,假设PowerShell默认输出表达式的结果(
Write Output
通常不需要):


请注意,虽然两个命令中都使用双引号字符串,但后一个命令在技术上是在中解析的(这是PowerShell的另一种类似解析模式的编程语言),因为命令行以“

”$($var):123:zzz'>test.txt
或“$var`:wetwet:ew”>test.txtI发现“
”$($var):123:zzz“>test.txt
适合我。@Seth:原来的问题标题有点模棱两可;这个问题不是关于从输出中省略尾随的换行符。请注意:
写入主机
输出无法在PSv4-上重定向。在PSv5+中,
输出文件
设置内容
/
添加内容
也支持
-NoNewline
。执行
“$var:123:zzz”|设置内容-路径“test.txt”
后,我的
test.txt
将变为空?我的powershell版本是2.0否,这也适用于powershell 2.0。请重试我编辑过的答案。@mklement0我根本没有考虑编码。现在就改-谢谢。如果你发现这些东西,请随意编辑我的答案,我相信你。@MartinBrandl谢谢你的更新;我很感激你能亲自编辑你的答案。
echo "$($var):123:zzz" > test.txt
"$($var):123:zzz" > test.txt