[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】批处理如何把文本转换成ANSI格式?

本帖最后由 大地 于 2025-3-28 15:48 编辑

【已解决】批处理如何把文本转换成ANSI格式?

在此感谢各路大神的热心支持和帮助!!

我用7Z从1.EXE中提取他的版本信息,提取出来的version好像是unicode格式的,用 > 导出来自动转换成ANSI格式的 转换成了新的1.TXT,结果仍是unicode格式,用type提取内容生成新的1.TXT,结果还不是ANSI格式的,试了好多都不行,看看好像挺简单的,折腾了我好久没搞定。也试了AI,没搞定,唉,当然我不想用手动另存为ANSI格式的,我想用批处理解决。哪位大神 有没有更好的办法?谢谢。

什么系统版本?
在cmd里直接运行chcp显示什么?

QQ 20147578

TOP

回复 2# czjt1234

用7Z把system32下的taskmgr.exe打开,再打开.rsrc,把里面的version复制出来,
然后用  type version > 1.txt  把version.txt里面的内容复制到1.txt中,结果生成的1.txt好像仍是unicode格式的
我主要是为了提取他的第一行,为了确定是那个系统版本,可惜不能转化为ANSI格式,批处理就不能自动判断是哪个版本了
所以求大神指点一下,或者改用其它方法也可。
((有些精简系统不一定有power shell功能,所以最好仍是用批处理解决))

TOP

本帖最后由 aloha20200628 于 2025-3-27 17:16 编辑

回复 1# 大地

假设 1.txt 文本文件是 unicode 编码或 utf-8 编码,可用以下的 powershell 转码方法转为系统默认的 ansi(即 gb2312 简中编码)

一。unicode 转为 ansi,存为 test-1.bat 与 1.txt 文件同目录运行
  1. @echo off &powershell "$s=(gc 1.txt -raw -enc 'unicode');sc 1.new.txt $s" &pause&exit/b
复制代码
二。utf-8 转为 ansi,存为 test-2.bat 与 1.txt 文件同目录运行
  1. @echo off &powershell "$s=(gc 1.txt -raw -enc 'utf8');sc 1.new.txt $s" &pause&exit/b
复制代码
如果确认 1.txt 文本文件的编码是 unicode(utf-16),亦可试用以下更简单的方法转码为 ansi(即 gb2312 简中编码)
  1. @echo off &chcp 936>nul
  2. type 1.txt>1.new.txt &pause&exit/b
复制代码

TOP

  1. 7z e -so Taskmgr.exe '.rsrc/version.txt' | iconv -c -f utf-16le -t gbk > a.txt
复制代码
Linux环境比较方便,7z直接输出到stdout,iconv转编码即可
试了一下busybox.exe里的iconv可以用
那么精简系统既然可以装7z,那么不到1M的busybox.exe顺便用一下应该可以吧

TOP

回复 1# 大地

用 powershell 直接获取指定 *.exe 文件的版本号,例如以下代码可以直接获取 ‘任务管理器’ 的版本号...
  1. powershell "(dir 'C:\windows\system32\Taskmgr.exe').versionInfo.productVersion"
复制代码

TOP

7Z从1.EXE中提取他的版本信息 ,是怎样提取的?? ,用命令不??把提取命令发出开看看??
提取出来的version好像是unicode格式的 ,确定真的是unicode??截个图出来看看??或者提取出来的1.txt发出来让大伙看看??

TOP

本帖最后由 aloha20200628 于 2025-3-27 19:19 编辑

回复 1# 大地

再给一个 bat+jscript 版本,存为 test.bat 运行,直接获取指定的执行文件版本号...
  1. 2>1/* ::
  2. @echo off &set "exeF=C:\windows\system32\Taskmgr.exe"
  3. for /f "delims=" %%v in ('cscript -e:jscript "%~f0" "%exeF%" ') do echo,%%v
  4. pause&exit/b */
  5. v=WSH.arguments,fso=WSH.CreateObject('Scripting.FileSystemObject')
  6. WSH.echo(fso.GetFileVersion(v(0)))
复制代码

TOP

回复 1# 大地

俺一般是使用went大神的coder(http://bcn.bathome.net/tool/coder.exe)来转换(拖拽文件到脚本 或 to_ansi.bat 1.txt 均可)
  1. @rem 转换文件编码为ANSI(即中文的GB2312)
  2. coder -c auto ansi -f "%~f1">"%~f1._ansi_"
  3. move /y "%~f1._ansi_" "%~f1"
复制代码

TOP

本帖最后由 大地 于 2025-3-28 09:52 编辑

回复 7# Five66

我用以下命令提取出来的文件,生成的version.txt
"C:\Program Files\7-Zip\7Z.exe" e %SystemRoot%\System32\Taskmgr.exe -ir!.rsrc\version.txt -y


我用以下的代码,无法读取版本号:
@echo off
setlocal enabledelayedexpansion
set /p line=<version.txt
set substr=!line:~20,5!
echo 截取结果:%substr%
pause
endlocal


再改用 type version > 1.txt 生成的1.txt
再用以下代码提取里面的版本号,仍无法读取,不显示
@echo off
setlocal enabledelayedexpansion
set /p line=<1.txt
set substr=!line:~20,5!
echo 截取结果:%substr%
endlocal
pause
同样无法读取字段


最后手动新建一个2.txt,同样复制version.txt里面的内容或自已随意在第一行输入一定量的字母和数据,再或者用刚才7Z导出的version.txt用手动并保存为ANSI格式的(其它没有作多余的动作),
同样的代码可以读取里面的字段
@echo off
setlocal enabledelayedexpansion
set /p line=<2.txt
set substr=!line:~20,5!
echo 截取结果:%substr%
pause
endlocal
可以读取显示版本号


((主要是精简系统,有时候玩PE系统,有时无法运行powershell功能,所以暂时没找到更好的方案))。再试试其它各位大神提供的方案。谢谢。

TOP

回复 10# 大地


    试试执行下面代码转换后 ,再根据输出生成的1.txt内容读取
  1. sort /r version.txt >1.txt
复制代码

TOP

本帖最后由 大地 于 2025-3-28 13:42 编辑

回复 11# Five66

测试成功,大神大牛了!!(代码又简单)

另外老师:

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('""C:\Program Files\7-Zip\7Z.exe" e "%SystemRoot%\System32\Taskmgr.exe" -ir!.rsrc\version.txt -y" -so ^| sort /r') do (
    set "line=%%a"
    goto ProcessLine
)
:processLine
set "substr=!line:~20,5!"
echo 截取结果:!substr!
pause
endlocal


这个代码问题出在哪里,显示
command Line Error:
incorrect windcard type markerr.rsrc\version.txt
截取结果:~20.5

但单行执行是正确的 合并后就不对了  好像是那个 单引号或双引号不对?还是怎么的?

TOP

回复 12# 大地


  
  1. @echo off
  2. for /f "delims=" %%a in ('""C:\Program Files\7-Zip\7Z.exe" e "%SystemRoot%\System32\Taskmgr.exe" -ir!.rsrc\version.txt -y -so | sort /r"') do (
  3.     set "line=%%a"
  4.     goto ProcessLine
  5. )
  6. :processLine
  7. setlocal enabledelayedexpansion
  8. set "substr=!line:~20,5!"
  9. echo 截取结果:!substr!
  10. pause
  11. endlocal
复制代码

参考 http://www.bathome.net/thread-66195-1-2.html
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2025-3-28 15:38 编辑

回复 1# 大地

系统已经内置了用 vbs/jscript/powershell 直接获取文件版本号的功能,6楼、8楼已经提供了批处直调 powershell 版本和批处混编 jscript 版本,再给一个批处直调 mshta+vbs 版本...
  1. @echo off &set "exeF=C:\windows\system32\Taskmgr.exe"
  2. for /f "delims=" %%v in ('mshta vbscript:execute("set sa=createobject(""scripting.filesystemobject""):sa.getstandardstream(1).write(sa.GetFileVersion(""%exeF%"")):close"^)') do (echo,%%v)
  3. pause&exit/b
复制代码

TOP

返回列表