标题: [文本处理] 【已解决】求助使用批处理调用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中不要有英文单引号- set a=欢迎
- set b=来到
- set c=批处理之家
- 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
要不手动转码- 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,内容里不要有英文双引号和英文单引号,除非你了解批处理怎么解析英文双引号和转义英文双引号- set a=欢迎
- set b=来到
- set c=批处理之家
- 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表示回车,但只用其中之一的情况下好像也没发现什么问题- @echo off
- set Line1=user_pref(\"mail.server.server1.directory\", \"D:\\存档\");
- set Line2=user_pref(\"mail.server.server1.directory-rel\", \"[ProfD]../../../../../../../D:/存档\");
- set Line3=user_pref(\"mail.shell.checkDefaultClient\", false);
- set FilePath=D:\Backup\Temp\Tmp.js
- powershell -Command "$L=[Char]13+'';[IO.File]::WriteAllText('%FilePath%',('%Line1%'+$L+'%Line2%'+$L+'%Line3%'))"
- 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的可行性方法- powershell -c "$L=\"`r`n\";[IO.File]::WriteAllText('p.txt','第一行'+$L+'第二行'+$L+'第三行')"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |