这些批处理代码是什么?

Has*_*him 7 windows shell command-line cmd batch-file

我在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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

mkl*_*nt0 7

简而言之,代码[1] :

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

  • 所讨论的命令然后转换当前的控制台代码页编码的文件desktop.txt(一个的en-US系统中,例如,CP-437对)UTF-16 LE-encoded文件desktop.ini,它是(培养无关的)文件的文件资源管理器使用在控制文件夹的显示手.

  • 设置文件和关联图标文件的system(+S)和hidden(+H)属性,因为这就是这些文件的标记方式(假设它们只控制包含文件夹的显示,而不是数据文件本身).desktop.iniimage.ico

具体来说,3条感兴趣的行做如下:

  • CHCP 1252 >NUL(默默地)更改Windows-1252代码页.

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

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


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

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

在一天结束时,使用批处理文件来确定文件夹显示属性是一种脆弱的方法,因为它主要基于对官方API进行逆向工程 - 这可能会发生变化.

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