windows - 这些批处理代码行是做什么用的?

标签 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] :

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

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

  • 设置 system ( +S ) 和 hidden ( +H ) desktop.ini 的属性文件和相关的图标文件,image.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然后追加先前创建的desktop.txt的内容归档到desktop.ini ,使用“Unicode”(UTF-16 LE)编码(感谢/U),即完成临时文件desktop.txt的转换。至 UTF-16 LE -编码desktop.ini (之后删除了 desktop.txt)。


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

至于需要创建UTF-16 LE - 编码文件:这不是一个严格的要求 - 显然,当您使用文件资源管理器分配图标时,Windows 本身会在当前旧版中创建文件 - 单字节 - 编码(例如,Windows-1252 ).
也就是说,使用文化无关编码,例如UTF-16 LE至少在原则上是最稳健的方法。
但是,如果您写入的所有值 desktop.ini是 ASCII-only 字符(7 位范围),简单地通过管道传输 echo 是安全的输出到 desktop.ini直接。

归根结底,使用批处理文件来确定文件夹显示属性是一种脆弱的方法,因为它本质上是基于对官方文件的逆向工程API——可能会改变。

更一般地说,现在最好避免使用批处理文件来做任何 - 请改用 PowerShell。

关于windows - 这些批处理代码行是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40119136/

相关文章:

batch-file - 复制bat文件中的多个文件

Windows批处理脚本从文件名中删除括号中的文本?

variables - 批处理 - 在另一个变量中回显变量的值?

c++ - 如何按顺序或在指定地址分配内存?

c++ - 独立、操作系统无关、架构中立、多线程库

bash - Shell 脚本 - CURL 脚本返回错误

linux - 如何在 bash 中创建一个附加到另一个文件的伪文件

shell - 提取网页上所有图像列表的脚本(网页抓取代码)

c++ - WinApi 线程(指针错误)

python - 皮斯坦 : CompileError: command 'gcc' failed with exit status 1 (Windows)