找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 22150|回复: 8

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

[复制链接]
发表于 2023-11-14 19:42:00 | 显示全部楼层 |阅读模式
本帖最后由 不知道是谁 于 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系统的前提下不借助第三方工具,如果有更好的方法,也可以推荐一下,谢谢!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-11-14 22:52:32 | 显示全部楼层
试试参考下面的,直接保存成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:14 | 显示全部楼层
本帖最后由 不知道是谁 于 2023-11-15 09:41 编辑

回复 2# Five66


    可以将变量分成三行写入吗?比如原文件存在,先清空原文件,再依次分行写入变量a、b、c,如果原文件不存在则创建后再依次分行写入
发表于 2023-11-15 12:06:30 | 显示全部楼层
要不手动转码
  1. echo 你好 | iconv -f gbk -t utf-8 > b.txt
复制代码
iconv这些工具busybox-w32.exe里都有
要不调用vim转码保存。。。
发表于 2023-11-15 13:37:23 | 显示全部楼层
回复 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

评分

参与人数 1技术 +1 收起 理由
不知道是谁 + 1 感谢

查看全部评分

 楼主| 发表于 2023-11-15 14:37:18 | 显示全部楼层
本帖最后由 不知道是谁 于 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
复制代码
发表于 2023-11-15 14:53:43 | 显示全部楼层
回复 6# 不知道是谁


默认是无bomutf8不可靠,不同环境版本可能不一样
回车符一般是看不出来的(包括回车符),得专门找能显示的文本编辑器才能查看,因此不同的文本编辑器查看显示时可能不一样
变量里最好不要有英文双引号,还好你的是成对的,而且是不连续的
 楼主| 发表于 2023-11-15 19:24:25 | 显示全部楼层
回复 7# Five66


[Char]13 和 [Char]10 还是要一起搭配使用的,前面忘记在Win7上也测试下就下结论了,哈哈
不过Win10系统可能是记事本显示的原因,任选其一都有自动换行效果
 楼主| 发表于 2023-11-20 06:13:42 | 显示全部楼层
找到另一种换行输出UTF-8的可行性方法
  1. powershell -c "$L="`r`n";[IO.File]::WriteAllText('p.txt','第一行'+$L+'第二行'+$L+'第三行')"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 09:18 , Processed in 0.019543 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表