我正在尝试使用Powershell将3行纯文本回显到文件中:
echo "#Generated" > psftp.scp
echo "put test.txt" >> psftp.scp
echo "quit" >> psftp.scp
然后,我使用psftp.exe批处理模式运行该文件(在SFTP中执行命令),但psftp错误地看到一个无效字符:
psftp: unknown command " ■#"
我错过了什么?我可以在Windows记事本中手动键入文件,它(PSFTP)可以工作。无论我将第一行更改为(X1 M0 N1 X),它都会得到这个错误,第一部分中有块符号。
我试过在记事本++ w/“显示所有符号”中查看该文件,但只在行尾看到CR & LF,这是正常的。
4条答案
按热度按时间zpgglvta1#
尝试使用set/add-content而不是redirection。您可能还需要设置编码。
iih3973s2#
和Out-File一样,Powershell 5中“〉”和“〉〉”的默认编码是UTF 16 LE(“Unicode”)。我猜psftp读不懂这个?“FF FE”是编码签名或“BOM”。你是如何运行psftp的?
在powershell 5.1中设置“〉"、“〉〉”和out-file的默认编码:
8yparm6h3#
在我的例子中,我将一个.cmd文件中的.ps1管道传输到powershell中
尽管以其他方式运行脚本时没有错误,但以这种方式运行时,由于无效字符,它会在第一行(注解行)抛出语法错误。
我发现如果我用wScite编辑器保存. ps1文件,默认值是“UTF-8 with BOM”,我将其更改为“UTF-8”,之后将脚本管道传输到PowerShell就可以正常工作了。
dhxwm5r44#
许多年后,一种系统概述的尝试:
>
和>>
,因为它们现在创建*无BOM的UTF-8***文件(就像 * 所有 * 文件写入cmdlet现在 * 一致 * 做的那样)。-Encoding
调用cmdlet,如下所述。>
和>>
默认为UTF-16LE(PowerShell错误地将其称为Unicode
),很少有外部程序理解这一点,这是问题的原因。[1]>
和>>
实际上是Out-File
和Out-File -Append
的别名,指定 different 编码需要使用-Encoding
参数显式调用它们。Set-Content
和Add-Content
,它们默认为Default
,表示系统的活动ANSI代码页,例如美国英语系统上的Windows-1252。如果您想要 * 无BOM的UTF-8,这就有点棘手了,因为Windows PowerShell的cmdlet * 不 * 支持创建此类文件-
-Encoding utf8
总是创建 * 带有 * BOM的文件(不像在 PowerShell(Core) 中,相反地,您必须使用-Encoding utf8bom
来显式地请求BOM)。奇怪的是,New-Item
* 确实 * 创建了无BOM的UTF-8文件,因此它可以用于创建文件,这允许后续的Add-Content
调用安全地使用-Encoding utf8
,因为它们不会将BOM添加到 existing 文件内容中。[1]PowerShell创建的UTF-16 LE文件 * 总是 * 有一个BOM (Byte Order Mark,它是2字节序列
0xFF
,0xFE
,字符/代理对的一半表示为 *16位代码单元 *,即 * 两个 * 字节,ASCII范围字符的0x0
(NUL
)作为其2字节序列中的第二个字节。