Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PowerShell重定向>&燃气轮机;是否更改文本内容的格式?_Powershell_Io Redirection - Fatal编程技术网

为什么PowerShell重定向>&燃气轮机;是否更改文本内容的格式?

为什么PowerShell重定向>&燃气轮机;是否更改文本内容的格式?,powershell,io-redirection,Powershell,Io Redirection,我想使用重定向append>或write写入txt文件,但当我这样做时,我收到一个奇怪的格式“\x00a\x00p…” 我成功地使用了设置内容和添加内容,为什么它们按预期工作,而不是>和重定向操作符 使用PowerShellcat以及简单的Python打印显示输出 rocket\u brain>new item test.txt rocket_brain>“附加使用添加内容”|添加内容测试.txt rocket_brain>cat test.txt 使用添加内容进行追加 但是如果我使用重定向附

我想使用重定向append
>
或write
写入txt文件,但当我这样做时,我收到一个奇怪的格式
“\x00a\x00p…”

我成功地使用了
设置内容
添加内容
,为什么它们按预期工作,而不是
>
重定向操作符

使用PowerShell
cat
以及简单的Python打印显示输出

rocket\u brain>new item test.txt
rocket_brain>“附加使用添加内容”|添加内容测试.txt
rocket_brain>cat test.txt
使用添加内容进行追加
但是如果我使用重定向附加
>>

rocket\u brain>“使用重定向追加”>>test.txt
rocket_brain>cat test.txt
使用添加内容进行追加
一个p e d u s i g r e c t
简单Python脚本:read_test.py

以open(“test.txt”、“r”)作为文件:#以readmode打开test.txt
data=file.readlines()#将每一行附加到列表数据中
打印(数据)#输出列表,每个输入行作为一个项目
使用read_test.py,我看到了格式上的差异

rocket\u brain>python read\u test.txt
['Added using add content\n','a\x00p\x00p\x00e\x00n\x00d\x00e\x00d\x00\x00u\x00s\x00i\x00n\x00g\x00\x00r\x00e\x00d\x00i\x00r\x00c\x00t\x00\r\x00\n','\x00']
注意:如果我只使用重定向append
(或write
),而不首先使用
添加内容
,则
cat
输出看起来正常(而不是间隔开),但在使用Python脚本时,我将获得每行的
/x00p
格式(包括从
>
运算符开始后的任何
添加内容
命令)。在记事本(或VS等)中打开文件时,文本的外观始终与预期一致。使用
>
中的
(而不是PS)也会以预期的ascii格式存储文本

相关链接:,
重定向控制台输出。因此,我假设有时也会包含一些奇怪的字符。
Out File
cmdlet的关系更为密切

添加内容
不会将控制台输出转发到文件,它只写入您提供的值(例如变量或管道对象)


注意:问题最终在于,在Windows PowerShell中,不同的cmdlet/运算符使用不同的默认编码。这一问题已在PowerShell Core(v6+)中得到解决,其中一致使用了无BOM的UTF-8


  • >
    在附加到现有文件时,盲目应用
    输出文件的默认编码(实际上,
    的行为类似于
    输出文件
    >
    类似于
    输出文件-附加
    ),它在Windows PowerShell中是名为Unicode的编码,即UTF-16LE,其中大多数字符编码为2字节序列,即使是ASCII范围内的字符;后者的高字节为
    0x0
    NUL

    • 因此,除非目标文件的现有内容使用相同的编码,否则最终将混合使用不同的编码,这就是您的情况。[1]
  • 相比之下,
    添加内容
    ,确实会尝试检测文件的现有编码谢谢,您在一个空文件上使用了它,在这种情况下,将应用
    设置内容
    的默认编码
    ,在Windows PowerShell中,该编码名为
    默认
    ,它引用了到系统的活动ANSI代码页

  • 因此,要在追加更多内容时匹配最初由
    Add Content
    调用创建的单字节ANSI编码,请使用
    Out File-Append-encoding Default
    ,而不是
    ,或者继续使用
    Add Content

    • 或者,使用
      addcontent-encoding…
      选择不同的编码,并在
      Out File-Append
      调用中进行匹配;UTF-8通常是最佳选择,不过请注意,在Windows PowerShell中创建UTF-8文件时,它将从BOM表开始(一个伪字节顺序标记,将文件标识为UTF-8,这是类Unix平台通常不希望看到的)

    • 在PowerShell v5.1+中,您还可以全局更改默认编码,包括
      >
      (这在早期版本中是不可能的)。例如,要更改为UTF-8,请使用:
      $PSDefaultParameterValues['*:Encoding']='UTF8'


除了不同的默认编码(在Windows PowerShell中),重要的是要注意,一方面
设置内容
/
添加内容
,另一方面
/
>>
/
输出文件[-Append]
,在非字符串输入中的行为基本不同

简而言之:前者对输入对象应用简单的
.ToString()
-格式设置,而后者执行与控制台中相同的输出格式设置-有关详细信息,请参阅



[1] 由于
Add content
设置了初始内容,Windows PowerShell将文件解释为ANSI编码(在没有BOM表的情况下为默认值),其中每个字节都是其自己的字符。因此,后面附加的UTF-16内容也被解释为ANSI,因此
0x0
字节被视为其自身权利中的字符,它们像空格一样打印到控制台。

>或out file-append默认情况下将附加unicode文本,即使fir中的文件不是unicodest place.添加内容将被选中
a p p e n d e d   u s i n g   r e d i r e c t
00000000: fffe 6100 7000 7000 6500 6e00 6400 6500  ..a.p.p.e.n.d.e.
00000010: 6400 2000 7500 7300 6900 6e00 6700 2000  d. .u.s.i.n.g. .
00000020: 7200 6500 6400 6900 7200 6500 6300 7400  r.e.d.i.r.e.c.t.
00000030: 0d00 0a00                                ....