Для чего нужны эти строки пакетного кода?

я наткнулся на следующий пакетный код на 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 связано с чем-то, что называется "кодовой страницы", 1252 соответствует "западноевропейской латыни", поэтому я лучше всего предполагаю, что это заставляет скрипт использовать латинский набор символов. Во вторых двух строках открываются экземпляры CMD;SS64 говорит, что переключатель /A на первом выводит его в ANSI, а /U на втором выводит Unicode. Это примерно все, на что я могу спекулировать, и я был бы очень признателен, если бы кто-нибудь мог пройти каждую основную часть этих трех строк и рассказать мне, что они делают.

спасибо!

1 ответов


короче, код[1] :

  • создает временное чей контент со временем станет desktop.ini, но с разные кодировки.

  • команды, о которых идет речь, затем преобразуют текущий-консольный-кодированный файл desktop.txt (например, в системе en-US,CP-437) к UTF-16 LE-закодированный файл desktop.ini, который является (независимым от культуры) файлом Explorer используется для управления отображением папки под рукой.

  • задает 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-закодированные файлы; другими словами: отправка этой строки в файл 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.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 (7-битный диапазон), безопасно просто передавать echo вывод desktop.ini напрямую.

в конце дня, используя пакетным файлом для определения атрибутов отображения папок является хрупкой подход, учитывая, что по существу, основан на обратном проектировании официальных API - интерфейсов, которые могут измениться.

в более общем смысле, используя пакетные файлы, чтобы сделать что-нибудь лучше избегать в эти дни-вместо этого используйте PowerShell.