Board logo

标题: [技术讨论] 在powershell执行重定向后的文件, 包含中文会报错 [打印本页]

作者: 5i365    时间: 2021-11-23 06:01     标题: 在powershell执行重定向后的文件, 包含中文会报错

求高手指点一下, 怎样在powershell中成功回显批处理中的中文,

下面的代码能成功执行, 并在powershell控制台回显信息
@'
@echo off
echo abcd
'@ | Out-File -Encoding default "bat.bat"
.\bat.bat
-------------------------------------------------------
但是下面的代码, 就不行了, 会报错
@'
@echo off
echo abcd
echo 中国
'@ | Out-File -Encoding default "bat.bat"
.\bat.bat
------------------------------------------------------
改为 -Encoding ascii 后, 能执行, 但是中文字显示乱码
改为 -Encoding utf8 后, 仍然报错
作者: flashercs    时间: 2021-11-23 07:38

ps here string的换行符是\n 而不是\r\n; 批处理对\n换行符 支持不佳。
可以这样
  1. @'
  2. @echo off
  3. echo abcd
  4. echo 中国
  5. '@ -replace '(?<!\r)\n',"`r`n"| Out-File -Encoding default "bat.bat"
复制代码

作者: 5i365    时间: 2021-11-23 08:25

回复 2# flashercs


    想再请教一下高手, 您是怎样看到的换行符是\n? 从什么工具里调试看到的?
作者: flashercs    时间: 2021-11-23 09:52

本帖最后由 flashercs 于 2021-11-23 09:55 编辑

回复 3# 5i365


    ps cmdlet
  1. Format-Hex -Path .\bat.bat
复制代码
或者用winhex
还有一点,这个here string在 powershell 与 powershell_ise 的换行符是不一致的,powershell中是\n ,powershell_ise中是 \r\n
作者: 5i365    时间: 2021-11-23 12:38

本帖最后由 5i365 于 2021-11-23 12:42 编辑

回复 4# flashercs


    多谢!
@echo off
start "" notepad
echo 我是中国人
上面的信息输出为下面的信息, 没有找到\n

----
           Path: C:\Users\Administrator\Desktop\a.bat

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   40 65 63 68 6F 20 6F 66 66 0D 0A 73 74 61 72 74  @echo off..start
00000010   20 22 22 20 6E 6F 74 65 70 61 64 0D 0A 65 63 68   "" notepad..ech
00000020   6F 20 CE D2 CA C7 D6 D0 B9 FA C8 CB 0D 0A        o ÎòêÇÖD1úèË..
作者: flashercs    时间: 2021-11-23 13:03

回复 5# 5i365


    0D 是 \r, 0A 是\n
作者: 5i365    时间: 2021-11-23 13:17

回复 6# flashercs


    学习了, 多谢
作者: 5i365    时间: 2021-11-23 14:01

回复 6# flashercs


    大侠你好, 替换换行符也乱码了, 批处理中是在找卷标为win的盘符, 中国二字输出为乱码, 但是在powershell ise中没有乱码, 看来还有哪里要改
,把下面的代码, 另存为test.ps1右键中选择使用powershell运行,  

@'
@echo off
for %%a in (Z Y X W V U T S R Q P O N M L K J I H G F E D C B A) do (
vol %%a:|findstr /i /e win&&echo %%a
) 2>null
echo 中国
'@ -replace '(?<!\r)\n', "`r`n" | Out-File -Encoding default b.bat
.\b.bat
cmd /c pause
作者: flashercs    时间: 2021-11-23 14:40

回复 8# 5i365


    你的test.ps1保存编码是utf-8, 就这样了。
ps1 编码建议保存为utf-8 with bom 或 ANSI 就不会乱码




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2