Board logo

标题: [文本处理] 【已解决】求助使用批处理调用powershell写入内容生成utf-8文件 [打印本页]

作者: 不知道是谁    时间: 2023-11-14 19:42     标题: 【已解决】求助使用批处理调用powershell写入内容生成utf-8文件

本帖最后由 不知道是谁 于 2023-11-15 19:59 编辑

批处理定义变量a、b、c
然后调用powershell,读取变量a、b、c,再写入文件,保存为无BOM utf-8格式,要兼容Win7和Win10系统

类似:

set a=欢迎
set b=来到
set c=批处理之家
powershell -Command "***%a%***%b%***%c%***| ***File.txt -Encoding ***"

目前我想到的办法是切换活动页面,在需要写入变量a、b、c之前使用chcp 65001 >nul
这样写入的文件内容就是UTF-8了,写入完成后再使用chcp 936 >nul切换回来,美中不足的是切换时会清屏,因为要显示一些东西,不想用太多的CALL重新调用信息显示

在兼容Win7、Win10系统的前提下不借助第三方工具,如果有更好的方法,也可以推荐一下,谢谢!
作者: Five66    时间: 2023-11-14 22:52

试试参考下面的,直接保存成ansi编码的bat运行后,会在当前目录生成无bomutf8的File.txt
注意:由于powershell命令是包含在英文双引号里面的,所以powershell里用的是英文单引号,因此批处理变量a,b,c中不要有英文单引号
  1. set a=欢迎
  2. set b=来到
  3. set c=批处理之家
  4. powershell -Command "[io.file]::WriteAllText('%~dp0File.txt',('***%a%***%b%***%c%***'),[text.utf8encoding]::new($false,$false))"
复制代码

作者: 不知道是谁    时间: 2023-11-15 08:55

本帖最后由 不知道是谁 于 2023-11-15 09:41 编辑

回复 2# Five66


    可以将变量分成三行写入吗?比如原文件存在,先清空原文件,再依次分行写入变量a、b、c,如果原文件不存在则创建后再依次分行写入
作者: wanghan519    时间: 2023-11-15 12:06

要不手动转码
  1. echo 你好 | iconv -f gbk -t utf-8 > b.txt
复制代码
iconv这些工具busybox-w32.exe里都有
要不调用vim转码保存。。。
作者: Five66    时间: 2023-11-15 13:37

回复 3# 不知道是谁


之前的poweshell 2.0用不了,所以改了下
$L是换行符(CRLF),需要换行就+$L
变量a,b,c,内容里不要有英文双引号和英文单引号,除非你了解批处理怎么解析英文双引号和转义英文双引号
  1. set a=欢迎
  2. set b=来到
  3. set c=批处理之家
  4. powershell -c "$L=[char]13+[char]10+'';[io.file]::WriteAllBytes('%~dp0File.txt',[text.encoding]::utf8.GetBytes('%a%'+$L+'%b%'+$L+'%c%'))"
复制代码
上面看起来挺麻烦的,而且也不灵活,最好还是先生成有bom的utf8(或gbk)后,在转成无bom的utf8
作者: 不知道是谁    时间: 2023-11-15 14:37

本帖最后由 不知道是谁 于 2023-11-15 14:38 编辑
回复  不知道是谁


之前的poweshell 2.0用不了,所以改了下
$L是换行符(CRLF),需要换行就+$L
变量a,b ...
Five66 发表于 2023-11-15 13:37


我试了下,这样好像也可以,Win7和Win10上测试通过,输出的文件默认是无BOM的UTF-8
另外有个疑问,[Char]10表示换行[Char]13表示回车,但只用其中之一的情况下好像也没发现什么问题
  1. @echo off
  2. set Line1=user_pref(\"mail.server.server1.directory\", \"D:\\存档\");
  3. set Line2=user_pref(\"mail.server.server1.directory-rel\", \"[ProfD]../../../../../../../D:/存档\");
  4. set Line3=user_pref(\"mail.shell.checkDefaultClient\", false);
  5. set FilePath=D:\Backup\Temp\Tmp.js
  6. powershell -Command "$L=[Char]13+'';[IO.File]::WriteAllText('%FilePath%',('%Line1%'+$L+'%Line2%'+$L+'%Line3%'))"
  7. pause
复制代码

作者: Five66    时间: 2023-11-15 14:53

回复 6# 不知道是谁


默认是无bomutf8不可靠,不同环境版本可能不一样
回车符一般是看不出来的(包括回车符),得专门找能显示的文本编辑器才能查看,因此不同的文本编辑器查看显示时可能不一样
变量里最好不要有英文双引号,还好你的是成对的,而且是不连续的
作者: 不知道是谁    时间: 2023-11-15 19:24

回复 7# Five66


[Char]13 和 [Char]10 还是要一起搭配使用的,前面忘记在Win7上也测试下就下结论了,哈哈
不过Win10系统可能是记事本显示的原因,任选其一都有自动换行效果
作者: 不知道是谁    时间: 2023-11-20 06:13

找到另一种换行输出UTF-8的可行性方法
  1. powershell -c "$L=\"`r`n\";[IO.File]::WriteAllText('p.txt','第一行'+$L+'第二行'+$L+'第三行')"
复制代码





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