Powershell 用单个可扩展字符串调用回音意外导致中间输出换行。
我有以下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
$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.aecho
)。
这个答案解释了您的方法的问题
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