2023年10月12日 星期四

在 Bat 中如何跟 Ufft8 的程序互動 避免亂碼

在 Bat 中如何跟 Ufft8 的程序互動 避免亂碼

遇到的情況蠻坑人的某些程序預設會強制使用 utf8 ,這會導這不支援的 cmd 直接就攤手出亂碼了,我是在用 sftp 的時候遇到的

還特別坑的是他會強制修改 chcp 改成 65001 導致出錯誤信息的時候連帶後面的 echo 都一起跟著亂碼了

想了很多辦法最後試出來的是,委託給powershell執行,雖然還是無法避免被切 chcp 不過可以一起封裝在裡面執行完順便切回來



如何正確的在bat中打印utf8編碼的文字

先說一下最簡情況,我們一步一步來強化,首先就是丟進去執行

powershell -nop "winscp.com /script=script.txtx; exit $lastexitcode"


如此一來就可以得到正確的文字了,順便用 Exit 把執行的返回代碼給帶出來。
此時 PowerShell 會把執行結果回丟到 Cmd 上,可以在透過一般的寫法完整的捕捉到。

powershell -nop "winscp.com /script=script.txtx; exit $lastexitcode" > %LOG% 2>&1


這樣錯誤信息也會一起出來了。
再來下一步我們把重要的指令部分提取出來用管道送進去,剩下不重要的封裝在裡面

echo winscp.com /script=script.txt| powershell -nop "$input|iex; exit $lastexitcode"


這樣就抽取出來了,只需要在意管道的左邊即可,剩下都封裝在右邊
下一步是修正前面提到擅自更改 chcp 的問題

echo winscp.com /script=scripts.txt| powershell -nop "$input|iex; [console]::OutputEncoding=[Text.Encoding]::Default; Exit $LASTEXITCODE"


一樣封裝在 PowerShell 這樣可以眼不見為淨,就此就完成了

沒有留言:

張貼留言