这些批处理代码是什么?

时间:2016-10-18 22:29:43

标签: windows shell batch-file command-line cmd

我在SuperUser上遇到了以下批处理代码,其目的是以编程方式替换文件夹的图标。

CD "%userprofile%\desktop"
MKDIR "TEST FOLDER"
ATTRIB +s "TEST FOLDER"
CD "TEST FOLDER"
COPY /Y "%userprofile%\desktop\image.ico" "./image.ico"
ECHO [.ShellClassInfo] >> desktop.txt
ECHO ConfirmFileOp=0 >> desktop.txt
ECHO NoSharing=1 >> desktop.txt
ECHO IconFile=image.ico >> desktop.txt
ECHO IconIndex=0 >> desktop.txt
ECHO InfoTip= >> desktop.txt
CHCP 1252 >NUL
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > desktop.ini 2>NUL
CMD.EXE /D /U /C TYPE desktop.txt >> desktop.ini
DEL /F /Q desktop.txt
ATTRIB +S +H desktop.ini image.ico

我很容易得到脚本的其余部分,但我无法理解这三行:

CHCP 1252 >NUL
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > desktop.ini 2>NUL
CMD.EXE /D /U /C TYPE desktop.txt >> desktop.ini

SS64告诉我chcp 1252与称为"code page"的东西有关,1252对应于“西欧拉丁语”,所以我最好的猜测是强制脚本使用拉丁字符集。第二行打开CMD实例; SS64表示第一个上的/ A开关使其以ANSI输出,而第二个上的/ U使其输出Unicode。这和我可以推测的一样多,如果有人能够完成这三行的每个主要部分并告诉我他们在做什么,我真的很感激。

谢谢!

1 个答案:

答案 0 :(得分:7)

简而言之,代码 [1]

  • 创建临时 desktop.txt文件,其内容最终将成为desktop.ini,但不同的编码

  • 有问题的命令然后将当前控制台代码页编码的文件desktop.txt(例如,在en-US系统上,CP-437)转换为UTF-16 LE - 编码文件desktop.ini,文件资源管理器用来控制文件夹显示的文件独立文件。

  • system文件和关联的图标文件设置+Shidden)和+Hdesktop.ini)属性,{ {1}},因为这就是这些文件的标记方式(假设它们只控制包含文件夹的 display ,而不是数据文件本身)。

具体而言,3条感兴趣的行做如下:

  • image.ico(默默地)更改Windows-1252代码页。

  • CHCP 1252 >NUL有效地将字符串CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > desktop.ini 2>NUL发送到输出文件ÿþ - desktop.ini,当解释为ÿþ编码的字符串时,相当于字节数Windows-1252,用于标识0xFF 0xFE编码文件的BOM(字节顺序标记);换句话说:将此字符串发送到文件UTF-16 LE会将其标记为desktop.ini编码的文件。

    • UTF-16 LE只是抑制可以通过注册表
    • 定义的任何自动运行功能
    • /D告诉/A输出“ANSI”编码字符串,其中“ANSI”表示默认代码页 - 现在设置为cmd.exe
    • Windows-1252表示以下参数应作为命令执行,/C应在命令终止后退出。
  • cmd.exe然后使用“Unicode”(CMD.EXE /D /U /C TYPE desktop.txt >> desktop.ini)将以前创建的desktop.txt文件的内容追加到desktop.ini UTF-16 LE编码(感谢/U),它完成了将临时文件desktop.txt转换为UTF-16 LE - 编码desktop.ini(之后删除了desktop.txt)。

[1]
这个答案解释了代码的 intent ,这并不意味着它必然工作,尤其是在Windows 10中;例如,交互式分配图标似乎设置了一个不同的单个属性,组合图像文件和其特定内部资源的索引:例如,IconResource=C:\Users\jdoe\Desktop\image.ico,0

至于需要创建UTF-16 LE - 编码文件:这不是一个严格的要求 - 显然,Windows本身,当您使用文件资源管理器分配图标,在当前遗产中创建文件 - 单字节 - 编码(例如,Windows-1252) 也就是说,使用独立于文化的编码,例如UTF-16 LE至少原则上是最强大的方法。
但是,如果您要写入desktop.ini的所有值都是纯ASCII字符(7位范围),则可以直接将echo输出直接传送到desktop.ini

在一天结束时,使用批处理文件来确定文件夹显示属性是脆弱的方法,因为它基本上是基于对官方进行逆向工程API - 可能会改变。

更一般地说,现在最好避免使用批处理文件来执行任何 - 而是使用PowerShell。