Как сменить значок папки в Windows

Для быстрого визуального поиска или украшения внешнего вида папок (каталогов) ставят пользовательские иконки. Рекомендации покажут, как поменять значок папки в Windows  на свой.

Существует достаточно способов изменения иконки конкретного каталога или всех, с привлечением средств Windows, сторонних программ. Создайте новую папку или выберите существующую и выполняйте шаги ниже.

Как сменить внешний вид папки

Чтобы изменить значок папки в Windows Вам потребуется проделать несколько простых действий. Все подробно показано в видеоролике:

Фишки bat файлов

delfcode.ru

Для начала давай разбёремся в том, что же такое batch’и. Прежде всего – это пакетные дос файлы, которые содержат в себе в ascii виде набор досовских команд. По-русски говоря, bat файл содержит в себе скрипт, интерпритатором служит command.com.
Поясняю: после прочтения этой статьи, ты сможешь писать проги, которые удаляют системные файлы, форматируют диски и тд. Главное, тебе для этого понадобится только блокнот и прямые руки, никаких компиляторов и дебагеров не требуется (бачи не такие примитивные, как тебе кажется – есть вирусы\генераторы, на них написанные).
И ещё. Я не буду описывать все возможные флаги(параметры) каждой команды, только наиболее полезные.
Ну чё, готов? Поехали!

Простые команды:
Для начала давай разбёремся в том, что же такое batch’и. Прежде всего – это пакетные дос файлы, которые содержат в себе в ascii виде набор досовских команд. По-русски говоря, bat файл содержит в себе скрипт, интерпритатором служит command.com.
Поясняю: после прочтения этой статьи, ты сможешь писать проги, которые удаляют системные файлы, форматируют диски и тд. Главное, тебе для этого понадобится только блокнот и прямые руки, никаких компиляторов и дебагеров не требуется (бачи не такие примитивные, как тебе кажется – есть вирусы\генераторы, на них написанные).
И ещё. Я не буду описывать все возможные флаги(параметры) каждой команды, только наиболее полезные.
Ну чё, готов? Поехали!
Простые команды:

echo off – запрещение вывода на экран исполняемых команд (on – вкл.)
deltree /y %файл% – удалить файл (/y означает “удалить без вопросов”). Кста, в НТ работает тока del (флаг /y не нужен).
copy %путь\файл% %куда\файл% – копировать файло
mkdir %название_диры% – создать директорию
echo %текст% – вывести текст на экран
echo %текст% > %путь\файл% – создать файл и вписать в него текст
echo %текст% >> %путь\файл% – добавить текст в уже существующий файл
if exist %путь\файл% %команда% – если существует файл, выполнить команду
attrib %атрибут% %путь\файл% – поставить\убрать атрибуты файлу (+-h скрытый, +-s системный, +-r только чтение)
start %путь\файл% – запустить файло
cls – отчистить экран
pause – выводит сообщение “Нажмите любую кнопку…”
label %новая_метка% – поставить новую метку системного диска (диск С)
format %диск%: /q – быстрое форматирование диска 🙂 Несколько секунд
ren %путь\файл% %новое_название_файла% – переименовать файло
goto %метка%



:%метка% – перескoчить с одного места кода на метку.

Фишки, хитрости:
1: choice /N /T:y,%сек% > nul – типа таймера (на n секунд задерживает выполнение последующих команд).

2: %команда% > nul – запрещение вывода на экран самой команды и результата её действия (полезно при команде “copy”). Пример: copy c:\some.exe %windir%\some.exe > nul

3: regedit /s %путь\файл.reg% – добавить ключи в реестр из файла, без вопросов

4: start /m /w %путь\файл% – запустить файло в свёрнутом окне.

5: слышал про файл Autoexec.bat? Знаешь, что он грузится вместе с компом? Наверное, да. Так вот, он имеет расширение BAT. На что я намекаю? На то, что ты можешь в него прописать строчку, к примеру, “format C: /q” (прописывается она вот так: echo format C: /q >> c:\Autoexec.bat) и во время перезагрузки у жертвы отформатируется диск С.
Это я к тому, что любой скрипт, вставленный в этот файл, будет выполнен при загрузке компа. Также можешь создать в каталоге с виндой файл winstart.bat. Он также запуститья виндусом.

6: это относиться как раз к фишке с Autoexec’ом. К примеру, если ты положишь в каталог windows\command файл к примеру “load.bat” (наверное с плохим содержанием), это файлу из autoexec’a с вероятностью в 90% можно будет запустить строчкой “load”. И это ещё отстой..Ты сможешь загружать это файло такой строчкой: “load keybrd32.sys,,cyr\lat” или такой: “load VideoAdapter32.drv — By windows setup –“. Врятли такие строчки рискнёт кто-нибудь удалять и твоё файло без трабл загрузится..=)

7: if exist c:\Progra~1 set drv=c:
if exist d:\Progra~1 set drv=d:
if exist d:\Progra~1 set drv=e:
После выполнения этого скрипта в переменной %drv% будет прописан диск с Виндой, с Program Files’ами.

8: в переменной %windir% хранится каталог с виндусом в таком виде: диск:\название_каталога. Пример: copy c:\some.exe %windir%\some.exe

9: batch скрипты не любят длинные, либо состоящие из двух слов, названия. Длинные урезаются до 6-ти букв (после них должно стоять “~1”, к примеру “Program Files -> Progra~1”). Пробелы он просто убирает (The Bat -> TheBat~1).
Это я к тому, что в бачах обращайся к файлам по их досовским названиям. Пример: copy c:\some.exe c:\Progra~1\some.exe (копируется файл в папку Program Files).

10: echo var WSHShell = WScript.CreateObject(“WScript.Shell”); > %temp%\mes.js
echo WSHShell.Popup(“твой_текст”); >> %temp%\mes.js
start %temp%\mes.js
deltree /y %temp%\mes.js

Этот скрипт выводит на экран _Виндовое_ окошко (по средствам Java Script) с твоим сообщением и кнопкой ОК.
Ну вот наверно и всё! Здесь я умолчал о переменных, циклах и создании меню в batch’ах, так как это довольно объёмные темы. Следующая статья будет как раз посвещена им.

echo off – запрещение вывода на экран исполняемых команд (on – вкл.)
deltree /y %файл% – удалить файл (/y означает “удалить без вопросов”). Кста, в НТ работает тока del (флаг /y не нужен).
copy %путь\файл% %куда\файл% – копировать файло
mkdir %название_диры% – создать директорию
echo %текст% – вывести текст на экран
echo %текст% > %путь\файл% – создать файл и вписать в него текст
echo %текст% >> %путь\файл% – добавить текст в уже существующий файл
if exist %путь\файл% %команда% – если существует файл, выполнить команду
attrib %атрибут% %путь\файл% – поставить\убрать атрибуты файлу (+-h скрытый, +-s системный, +-r только чтение)
start %путь\файл% – запустить файло
cls – отчистить экран
pause – выводит сообщение “Нажмите любую кнопку…”
label %новая_метка% – поставить новую метку системного диска (диск С)
format %диск%: /q – быстрое форматирование диска 🙂 Несколько секунд
ren %путь\файл% %новое_название_файла% – переименовать файло
goto %метка%



:%метка% – перескoчить с одного места кода на метку.

Фишки, хитрости:
1: choice /N /T:y,%сек% > nul – типа таймера (на n секунд задерживает выполнение последующих команд).

2: %команда% > nul – запрещение вывода на экран самой команды и результата её действия (полезно при команде “copy”). Пример: copy c:\some.exe %windir%\some.exe > nul

3: regedit /s %путь\файл.reg% – добавить ключи в реестр из файла, без вопросов

4: start /m /w %путь\файл% – запустить файло в свёрнутом окне.

5: слышал про файл Autoexec.bat? Знаешь, что он грузится вместе с компом? Наверное, да. Так вот, он имеет расширение BAT. На что я намекаю? На то, что ты можешь в него прописать строчку, к примеру, “format C: /q” (прописывается она вот так: echo format C: /q >> c:\Autoexec.bat) и во время перезагрузки у жертвы отформатируется диск С.
Это я к тому, что любой скрипт, вставленный в этот файл, будет выполнен при загрузке компа. Также можешь создать в каталоге с виндой файл winstart.bat. Он также запуститья виндусом.

6: это относиться как раз к фишке с Autoexec’ом. К примеру, если ты положишь в каталог windows\command файл к примеру “load.bat” (наверное с плохим содержанием), это файлу из autoexec’a с вероятностью в 90% можно будет запустить строчкой “load”. И это ещё отстой..Ты сможешь загружать это файло такой строчкой: “load keybrd32.sys,,cyr\lat” или такой: “load VideoAdapter32.drv — By windows setup –“. Врятли такие строчки рискнёт кто-нибудь удалять и твоё файло без трабл загрузится..=)

7: if exist c:\Progra~1 set drv=c:
if exist d:\Progra~1 set drv=d:
if exist d:\Progra~1 set drv=e:
После выполнения этого скрипта в переменной %drv% будет прописан диск с Виндой, с Program Files’ами.

8: в переменной %windir% хранится каталог с виндусом в таком виде: диск:\название_каталога. Пример: copy c:\some.exe %windir%\some.exe

9: batch скрипты не любят длинные, либо состоящие из двух слов, названия. Длинные урезаются до 6-ти букв (после них должно стоять “~1”, к примеру “Program Files -> Progra~1”). Пробелы он просто убирает (The Bat -> TheBat~1).
Это я к тому, что в бачах обращайся к файлам по их досовским названиям. Пример: copy c:\some.exe c:\Progra~1\some.exe (копируется файл в папку Program Files).

10: echo var WSHShell = WScript.CreateObject(“WScript.Shell”); > %temp%\mes.js
echo WSHShell.Popup(“твой_текст”); >> %temp%\mes.js
start %temp%\mes.js
deltree /y %temp%\mes.js
Этот скрипт выводит на экран _Виндовое_ окошко (по средствам Java Script) с твоим сообщением и кнопкой ОК.
Ну вот наверно и всё! Здесь я умолчал о переменных, циклах и создании меню в batch’ах, так как это довольно объёмные темы. Следующая статья будет как раз посвещена им.

Автор: D4rkGr3y

Теперь, когда у нас уже есть некоторая подготовка, начнем пожалуй.
Для начала определитесь с типами файлов, которые хотите отсортировывать с рабочего стола (да, держу пари у вас все download-менеджеры настроены на сохренение файлов на рабочий стол или где-то в папку downloads? ей бы тоже не помешала сортировка…) или вообще из любой нужной папки (в принципе возможно конечно и создание скрипта который весь ваш винт переполошит, сложит старательно все EXE в папочку EXE, после чего у вас перестанет запускаться винда :))…

Предположим, у нас регулярно появляются на рабочем столе файлы расширений: .txt .doc .rtf .PDF (тексты) .avi .mpg .divx .xvid (видео) .mp3 .wav .ogg .wma (звук) .jpg .bmp .gif .png (картинки) .rar .zip .gz .7z (архивы) и .exe – исполняемые файлы. Нам надо рассортировать всю эту белиберду…

Итак. Допустим, текстовому каталогу мы дадим имя TXT, каталог для видео назовем AVI, для музыки – MP3, для картинок – JPG, для архивов – RAR, для исполняемых файлов – EXE.

Эти каталоги не нужно создавать заранее, так как мы предусматриваем регулярное “вырезание” всех этих папок с рабочего стола куда-либо в целях архивирования, хранения или даже в целях безопасности. Значит, нам нужно будет создать их предварительно или проверить их существование.
Получаем коротенький простой скрипт…

@echo off

if not exist TXT md TXT
if not exist AVI md AVI
if not exist MP3 md MP3
if not exist JPG md JPG
if not exist RAR md RAR
if not exist HTM md HTM
if not exist EXE md EXE

Для тех, кто не понял: “если не существует директория ТХТ создать директорию ТХТ”; “если не существует директория AVI создать директорию AVI” и так далее. Но это только часть работы, зачем нам пустые каталоги?
Приступим к написанию скрипта сортировки файлов. У меня он выглядит так:

move /-Y *.txt TXT
move /-Y *.doc TXT
move /-Y *.rtf TXT
move /-Y *.PDF TXT

move /-Y *.avi AVI
move /-Y *.mpg AVI
move /-Y *.divx AVI
move /-Y *.xvid AVI

move /-Y *.mp3 MP3
move /-Y *.wav MP3
move /-Y *.ogg MP3
move /-Y *.wma MP3

move /-Y *.jpg JPG
move /-Y *.bmp JPG
move /-Y *.gif JPG
move /-Y *.png JPG

move /-Y *.RAR RAR
move /-Y *.ZIP RAR
move /-Y *.gz RAR
move /-Y *.7z RAR

move /-Y *.exe EXE

C командой move всё понятно, флаг /-Y стоит, чтобы при наличии двух одинаковых файлов они не перезаписывались поверх (типичный случай: у вас в директории TXT существует “Текстовый документ.txt” и совершенно другой файл с таким же именем на рабочем столе, если вы уберете флаг /-Y, файл с рабочего стола перепишет нужный вам файл в папке ТХТ, и тогда его уже не вернуть). Командная строка вас спросит, можно ли перезаписать файл поверх. Рекомендую отвечать нет, переименовывать ТХТшку в что-то более внушительное и запускать скрипт снова 🙂

Да, в самом конце команды указана целевая директория, куда попадет файл. В принципе вы можете сбрасывать все документы не прямо на рабочий стол, а к примеру в папку Desktop/Files/, тогда вам следует дописать это перед каждой директорией в скрипте (как в первом, проверочном, так и в сортировочном).

Кроме того, можно пользоваться удобной функцией SET. К примеру, вам неудобно писать после каждого файла путь, куда его следует бросать (быть может вы хотите сбрасывать файлы разных типов на разные винчестеры), тогда следует применять этот прием. Пусть у нас существует директория C:/Files/TXT для текстовых файлов. Мы можем сохранить её в переменной %TXT% для простоты. Для этого просто в BAT-файле с новой строки пишем

SET TXT=C:/Files/TXT

Вот и всё! Теперь команда move для TXT будет такая:

move /-Y *.txt %TXT%

Намного проще вначале задать все пути и переменные из нескольких букв для них, а затем уже использовать эти переменные для сортировки файлов. Кроме того, так вы облегчите себе последующее добавление новых типов файлов и их сортировку!

И последнее. В подтверждение выполненной работы вы можете дописать в конец скрипта что-то вроде:

echo All files sorted!
pause

В этом случае вам выдадут сообщение о сортировки всех файлов и оно будет висеть до тех пор, пока вы не нажмете любую клавишу (если не употребить pause, сообщение промелькнет и вы его просто не успеете увидеть).

Не забудьте сохранить скрипт и переименовать TXT-шку в BAT-файл. Перед запуском проверьте всё ещё раз, кстати если вы нажмете правой кнопкой по BAT-файлу, можно без проблем найти пункт “Изменить” (Edit). Он позволяет редактировать BAT-файлы без переименовывания во что-либо другое.

Запуск программы в скрытом режиме в ХР

Бывают ситуации, когда надо запустить на компьютере пользователя программу в скрытом виде (чтобы не было кнопки программы на панели задач и иконки в трее, а также чтобы не было видно окна программы), однако программистами в программе не предусмотрен такой режим запуска.
Например, запуск какого-то монитора работы пользователя или клавиатурного шпиона… В этом случае можно воспользоваться средствами WSH для скрытого запуска таких программ. Вот пример JS-скрипта, запускающего в таком режиме обычный виндовый блокнот:

var WSHShell = WScript.CreateObject(“WScript.Shell”);
WSHShell.Run(“notepad”,0);

Второй параметр во второй строке, а именно – 0, указывает, что надо запустить файл в невидимом режиме. Создайте файл с расширением *.js и пропишите его в автозагрузку. Теперь работа твоей программы практически незаметна. Окно у нее невидимо, кнопки на панели задач нет, в диспетчере задач на вкладке “Приложения” она тоже не светится. Только в списке процессов возможно найти notepad.exe и снять его. Но если обозвать запускаемый файл позаковыристей, например, nvidia32.exe или volsnd32.exe, то далеко не каждый юзер найдет эту подделку. Да и потом, часто ли вы лазите в диспетчер задач с целью поиска “непонятных” процессов?

Тонкости работы в командной строке Windows

Недавно я вырос из лютого эникея в очень большой компании, до скромного сисадмина надзирающего за сетью в 10 ПК. И, как очень ленивый сисадмин, столкнулся с задачами по автоматизации своей деятельности. Полгода назад я еще не знал, что в командной строке Windows есть конвейеры. Это стало первым шокирующим открытием. И я пошел дальше, и выяснилось, что там, где я раньше писал утилитки на C#, Delphi или громоздкие скрипты с вложенными циклами, можно было обойтись парой команд forfiles или robocopy.
Не буду рассказывать о банальностях, типа о перечислении файлов и папок клавишей Tab. Под хабракатом расскажу о том, что может быть полезно начинающим админам и эникеям.

Горячие клавиши

Начнем с горячих клавиш, ведь сначала необходимо изучить, что нам может дать рабочая среда.

F1 — В консоли эта клавиша работает в точности как и стрелка вправо, т.е. выводит по одному символу из последней введенной (либо выбранной в истории) команды.
F2 + <символ> — Выводит последнюю введенную команду до указанного символа. Например, если последняя введенная вами команда выглядела вот так:

ping 192.168.25.1

то после нажатия комбинации клавиш F2 + 5 вы получите:

ping 192.168.2

F3 — Выводит последнюю, и только последнюю, в истории команду целиком.
F5 — Выводит последние введенные команды по порядку, также как и стрелка вверх.
F6 — Вставляет символ EOF на текущую позицию командной строки, что аналогично нажатию комбинации Ctrl + Z.
F7 — Диалоговое окно, содержащее историю команд.
image
Alt + F7 — Очищает историю команд.
<символ(ы)> + F8 — Перебирает команды, которые начинаются с символов уже введенных в командную строку.
Если перед нажатием F8 ничего не вводить, то эта клавиша будет работать как и стрелка вверх, но с небольшим отличием — перебор строк будет осуществляться циклично, т.е. после первой команды из списка будет выведена последняя.
F9 + <число> — Вставляет команду из истории под соответствующим номером. К примеру, в ситуации приведенной на скрине выше при нажатии комбинации F9 + 4 в консоли появится:

ipconfig

 

Операторы командной строки

Я, давным-давно, когда был маленький, даже не представлял как можно работать в консоли без графического интерфейса. Ведь вывод команд порой занимает десятки страниц, а если надо выбрать оттуда какие-то данные, то и постраничный вывод не спасет. Но однажды я поставил на старый комп FreeBSD, открыл хандбук и просто голова кругом пошла от открывшихся возможностей. Там можно перенаправить вывод команды на вход другой команды и это называется конвейером.

Оператором конвейера в *nix и cmd, является символ вертикальной черты.

|

Например, вывод всех текстовых файлов в текущей папке покажет команда

dir | find ".txt"

 

Оператор объединения команд

 

&

Пример: Команда1 & Команда2 – сначала выполнятся Команда1, а уже потом Команда2

Оператор И

 

&&

Пример: Команда1 && Команда2 — Команда2 будет выполняться только в том случае, если произошло успешное выполнение Команды1

Оператор ИЛИ

 

||

Пример: Команда1 || Команда2 — Команда2 будет выполняться только в том случае, если Команда1 не смогла выполниться.

Для группирования команд используются круглые скобки, примеры:

  • (Команда1 & Команда2) && Команда3 – Если Команды1 и Команды2, выполнятся успешно, произойдет выполнение Команды3.
  • (Команда1 & Команда2) || Команда3 — Если Команды1 и Команды2, не выполнятся, произойдет выполнение Команды3.

Спасибо за внимание! Жду критики и предложений…

UPD1

Для тех, кто не в теме, циркумфлекс(вот этот знак “^”) означает нажатие клавиши с Ctrl(^C = Ctrl +C).

^C — Прерывает команду, ну это все знают.
^S — Приостанавливает выполнение команды, а потом запускает.
^I — Аналог Tab, перебирает папки и файлы.
^M — Аналог Enter.
^H — Аналог Backspace.
^G — Написав в пакетном файле команду echo ^G можно пикать системным динамиком(спикером).
(Команды ^I и ^H, получены мной методом «научного тыка», еще есть ^J но не знаю, что она делает)

P.S. Другие тонкости командной строки Windows, уже неоднократно освещались на Хабре. И не вижу смысла копи-пастить.
P.P.S. Ссылки на интересные посты и статьи по другим возможностям командной строки Windows:
Ввод-вывод, циклы, переменные
Работа с массивами
Интереснейший топик по теме


Примеры:

for /f %%z in ('dir %1 ^| find /i ".rar"') do set idate=%%z
for /f "tokens=1-6 delims=/" %%A in ('echo %idate%/%date%') do set /a t=%%F*1461/4-%%C*1461/4+%%E*1461/48-%%B*1461/48+%%D-%%A
if %t% gtr %2 (del /q %1)

скрипт удаляет архивы в папке %1, старшие %2 дней.

forfiles /P %1 /M *.rar /P C:\Your_Directories /D %2 “cmd /C del /Q @path”

Как экранировать символ?

В командном языке Windows существует некоторый набор символов с высоким приоритетом, которые всегда трактуются как спецсимволы. К ним, в частности, относятся:

  • Операторы перенаправления ввода-вывода <, >, >>.
  • Оператор конвейера |.
  • Операторы объединения команд ||, & и &&.
  • Оператор разыменования переменной %…%.

В случае если символ, относящийся к одному из таких операторов, должен быть включен в вашу команду в его литеральном смысле, вас ждут определенные неожиданности. Например, при выполнении вот такой строки

      echo
      The ratio should be up to 10%.

символ процента будет «съеден» интерпретатором, который решит, что это попытка вывода значения какой-то переменной. В случае со знаком процента решение довольно хорошо известно и состоит в удвоении этого символа:

      echo
       The ratio should be up to 10%%.

после чего все заработает так, как надо. Однако в других случаях все менее очевидно. Рассмотрим командный сценарий, который генерирует незатейливый HTML-файл:

      @echo
      
      off
      
      set OUTPUTFILE=%1

echo<html>                                  >%OUTPUTFILE%
echo<head>                                 >>%OUTPUTFILE%
echo<title>This is a greeting page</title> >>%OUTPUTFILE%
echo</head>                                >>%OUTPUTFILE%
echo<body>                                 >>%OUTPUTFILE%
echoHello World!                           >>%OUTPUTFILE%
echo</body>                                >>%OUTPUTFILE%
echo</html>                                >>%OUTPUTFILE%

К сожалению, при попытке запуска этого “чуда инженерного разума” нас постигнет неудача в виде сообщения об ошибке

> was unexpected at this time.

Оно и понятно: командный интерпретатор не в силах разобраться, где его просят вывести на экран символ HTML-тега, а где перенаправить вывод. В нормальных языках программирования эта проблема обычно решается обрамлением строковых литералов кавычками. Отчасти это помогает и в bat-файлах. Но лишь отчасти. Выполнение строки

      echo
      "<html>"                                 >%OUTPUTFILE%

приведет к тому, что в выходной файл будут записаны и сами кавычки. Это явно не совсем то, что требуется.

К счастью, есть один малоизвестный способ, позволяющий добиться требуемого результата. Символ ^ позволяет экранировать любой другой символ с безусловным приоритетом. Таким образом, вышеприведенный пример генерации HTML может быть успешно записан так:

      @echo off
set OUTPUTFILE=%1

echo^<html^>                                    >%OUTPUTFILE%
echo^<head^>                                   >>%OUTPUTFILE%
echo^<title^>This is a greeting page^</title^> >>%OUTPUTFILE%
echo^</head^>                                  >>%OUTPUTFILE%
echo^<body^>                                   >>%OUTPUTFILE%
echoHello World!                               >>%OUTPUTFILE%
echo^</body^>                                  >>%OUTPUTFILE%
echo^</html^>                                  >>%OUTPUTFILE%

Таким же способом можно экранировать любой другой специальный символ. Очевидно, можно экранировать и сам ^. Не очень эстетично, зато дешево и практично. Слово «надежно» я пропустил умышленно…

Как перенести длинную строку?

Совет по поводу экранирующего символа ^ имеет еще одно применение: перенос строк. Я (как и многие из вас, наверное) люблю, чтобы любой исходный текст, который я пишу, выглядел красиво – даже *.bat-файлы. Одним из обязательных условий красоты и удобочитаемости кода для меня является его ширина: все строки должны умещаться в 78 столбцов. Можно поспорить по поводу числа 78, но в одном я непреклонен – ограничение на ширину текста кода должно быть, иначе это не код, а макароны.

Так вот долгое время *.bat-файлы портили мне жизнь тем, что иногда приходилось писать длинную строку – например, вызов какой-нибудь другой программы с кучей опций, и я не знал, что с этим делать. Происходило это нечасто, но всегда было неприятно. Но, к счастью, моя жизнь изменилась с тех пор, как я открыл для себя Супер-Символ ^:

packagebin.exe --recursive-search=yes --files-mask=exe,dll,pdb,obj ^
    --archive-type=zip --archive-level=max --deliver-method=ftp    ^
    --deliver-target=ftp://ftp.site.com

Помните лишь, что чудо-символ должен быть последним в строке – скажите «Нет!» концевым пробелам.

Как определить имя каталога, в котором находится запущенный командный файл?

Иногда сценарию надо знать полный путь к себе самому и/или к каталогу, в котором он находится. Это может понадобиться по разным причинам. Например, он должен достать из системы контроля версий исходники в каталог <script-dir>/src рядом с собой. Или, запускаются тесты из каталога <script-dir>/tests, и перед их запуском надо добавить каталог <script-dir>/bin в переменную PATH.

Можно, конечно, рассчитывать на то, что командный файл был вызван из того же каталога, где он находится, и тогда в качестве вышеупомянутого <script-dir> можно использовать переменную окружения %CD% – полный путь к текущему каталогу. Однако любые допущения в нашем деле недопустимы (хороший каламбур, однако!). Поэтому приведу более надежное решение.

Прежде всего, вспоминаем, что переменная %0 в bat-файле соответствует нулевому аргументу командной строки, т.е. имени самого файла. После этого читаем скудную документацию для команды call:

      call /?

и обнаруживаем, что при использовании нумерованных переменных %0-%9 можно использовать некоторые модификаторы:

        %~1         - разворачивает %1, удаляя кавычки (")
        %~f1        - разворачивает %1 в полный квалифицированный путь
        %~d1        - разворачивает %1 в букву диска
        %~p1        - разворачивает %1 в путь
        %~n1        - разворачивает %1 в имя файла
        %~x1        - разворачивает %1 в расширение файла
        %~s1        - развернутый путь будет содержать только короткие имена
        %~a1        - разворачивает %1 в атрибуты файла
        %~t1        - разворачивает %1 в дату/время создания файла
        %~z1        - разворачивает %1 в размер файла
        %~$PATH:1   - Ищет в каталогах, перечисленных в переменной среды PATH,
                       и разворачивает %1 в полное квалифицированное имя 
                       первого совпадения. Если имя перменной среды
                       не определено, или если файл не найден, этот 
                       модификатор вернет пустую строку

и, более того:

    Модификаторы можно объединять для получения сложных результатов:

        %~dp1       - разворачивает %1 в букву диска и путь
        %~nx1       - разворачивает %1 в имя файла с расширением
        %~dp$PATH:1 – ищет %1 в каталогах, перечисленных в переменной 
                       среды PATH, и разворачивает в букву диска
                       и путь к первому найденному файлу.
        %~ftza1     - разворачивает %1 в строку, подобную DIR

Таким образом, правильным будет использовать в качестве тега <script-dir> сочетание %~dp0, которое будет раскрыто в полный путь к каталогу, где находится сценарий. Например,

      "%~dp0\packagebin.exe" --recursive-search=yes --files-mask=exe,dll,pdb,obj ^
    --archive-type=zip --archive-level=max --deliver-method=ftp            ^
    --deliver-target=ftp://ftp.site.com --deliver-source="%~dp0\bin"

Обратите внимание на использование кавычек – потенциально каталог может иметь в своем пути пробел. Кавычки избавят от проблем в этом случае.

ПРЕДУПРЕЖДЕНИЕ
Опасайтесь бездумного применения команды cd %~dp0 без проверки результата выполнения. Теоретически, эта команда должна сменить текущий каталог на каталог, в котором расположен командный файл. Как правило, это работает. Однако возможны неожиданности. Однажды был написан простой командный сценарий, задача которого была просто удалить все каталоги рядом с собой. В «свою» директорию он переходил как раз через cd %~dp0. Все было проверено на локальной машине – работало замечательно. После этого сценарий был помещен на файл-сервер, где ему и полагалось быть. Я зашел с помощью Far в сетевой каталог, и для контрольной проверки решил запустить файл еще раз. Дальнейшее словно в тумане. cmd.exe правильно определил местонахождение bat-файла: \\servername\sharename\directory. Однако при попытке сделать туда cd, он сказал, что UNC-пути в качестве текущих каталогов не поддерживаются и лучше он сменит текущий каталог на C:\WINDOWS… Это было действительно мудрое решение… Часть сценария, отвечавшая за удаление всех каталогов, сработала отлично – хорошо, что я успел вовремя остановить это безумие.В тот день я узнал, что такое System Restore…

Как получить короткое (8.3) имя файла?

«А зачем? – спросите вы – Ведь мы живем в мире Интернета, Web-сервисов и NTFS с длинными именами файлов». Это действительно так, но иногда встречаются программы, которые отчаянно сопротивляются прогрессу, и в частности, не любят имен файлов и полных путей с пробелами. Одной из таких программ, кстати, является утилита build.exe из Windows DDK… В таких ситуациях спасает использование короткого, «беспробельного» DOS-имени для файла.

ПРЕДУПРЕЖДЕНИЕ
Доступ к файлу по короткому имени может быть не всегда возможен. На файловой системе NTFS создание коротких псевдонимов для файлов может быть отключено путем установки в единицу значения «NtfsDisable8dot3NameCreation» в ключе реестра «HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem».

Итак, все же (в предположении, что надругательства над NTFS не было) – как? Внимательный читатель должен был заметить в предыдущем разделе, что при обращении к переменным %0 – %9 можно использовать префикс

%~s1        - expanded path contains short names only

который нам как раз мог бы помочь. Но есть засада – все эти полезные префиксы нельзя использовать с произвольной переменной окружения, а присваивание переменным %0 – %9 не поддерживается. К счастью, описываемые префиксы можно еще использовать с переменными цикла for, и это дает нам способ достичь требуемого результата. Например, вот так можно получить 8.3-путь к “Program Files”:

      for /d %%i in ("%PROGRAMFILES%") do (
    set PROGRAMFILESSHORT=%%~si
)

echo8.3-имя для каталога "%PROGRAMFILES%" -^> "%PROGRAMFILESSHORT%"

Этот и другие модификаторы можно использовать и с любой другой формой цикла for, подробнее о которых можно узнать из:

      for /?

Как перенаправить стандартный вывод в файл?

Плоха та короткая программа, которая не стремится стать большой. К сожалению, это правило применимо и к командным файлам Windows тоже – иногда bat-файлы вырастают до довольно больших размеров. Если при этом результат выполняемых команд должен журналироваться, то все становится совсем плохо – почти каждая строка имеет хвостик типа

      echo
      Cleaning up the target directory >>%LOGFILE%
...
echoThe target directory has been cleaned >>%LOGFILE%

Гораздо проще было бы перенаправить стандартный вывод в файл, чтобы все команды echo и вообще, все, что выводится на экран, автоматически попадали в журнальный файл. Сделать это можно следующим образом (рассмотрим на знакомом примере генерации HTML-файла):

      @echo off
set OUTPUT=out.html

if "%STDOUT_REDIRECTED%" == "" (
    set STDOUT_REDIRECTED=yes
    cmd.exe /c %0 %* >%OUTPUT%
    exit /b %ERRORLEVEL%
)

echo^<html^>
echo^<head^>
echo^<title^>This is a greeting page^</title^>
echo^</head^>
echo^<body^>
echoHello World!
echo^</body^>
echo^</html^>

Здесь делается то же, что и раньше, но с перенаправлением стандартного вывода в файл out.html. Делается это простым способом – перезапуском сценарием самого себя. Сначала проверяется, не установлена ли переменная окружения STDOUT_REDIRECTED. Если она установлена, значит, сценарий уже перезапущен с перенаправленным выводом и можно просто продолжить работу. Если же переменная не установлена, то мы ее устанавливаем и перезапускаем скрипт (cmd.exe /c %0) с таким же набором параметров, что и исходная команда (%*) и перенаправленным в файл стандартным выводом (>%OUTPUT%). После завершения выполнения «перенаправленной» команды выходим.

Такое «единовременное» перенаправление имеет и еще один неочевидный плюс: файл открывается и закрывается только один раз, и всем командам и дочерним процессам передается дескриптор уже открытого файла. Во-первых, это чуть-чуть улучшит производительность (жизнь удалась – сроду бы не подумал, что буду когда-нибудь писать о производительности в bat-файлах). Во-вторых, это поможет избежать проблемы с невозможностью открыть файл для записи. Такое может случиться, если после выполнения одной из команд останется «висеть» какой-нибудь процесс. Он будет держать дескриптор интересующего нас файла и перенаправление вывода в этот файл для всех последующих команд провалится. Проблема может показаться надуманной, но однажды она украла у меня 2 часа жизни…

Как сложить два числа?

Краткий ответ – смотри:

      set /?

Длинный ответ таков. В bat-файлах можно производить довольно-таки продвинутые вычисления – продвинутые не в сравнении с другими языками, а в сравнении с отсутствием возможности что-либо вычислить вообще. Вычисление осуществляется командой set, если она выполняется с ключом /a. Поддерживается практически полный набор операторов языка C, включая шестнадцатеричный модификатор 0x. Переменные окружения в выражении не обязательно заключать в знаки процента – все, что не является числом, считается переменной. Подробнее – все-таки в man set, тьфу, то есть в set /?. А здесь напоследок – просто несколько примеров.

      @echo off

set ARG=1

rem Переменные окружения в выражении не обязательно заключать в %...%
set /a RESULT=ARG + 2
echo%RESULT%
remЕсли выражение содержит какие-либо из символов non grata, надо
remзаключить его в кавычкиset /a RESULT="ARG << 2"
echo%RESULT%
remШестнадцатеричная арифметика
set /a RESULT=0x1234 + 0x6786
echo%RESULT%
rem И многое-многое другое...

А можно создать в bat-файле функцию?

Да, можно. Более того, иногда даже нужно. Правда, функциями это можно назвать условно. Есть особый синтаксис команды call, который позволяет перейти на метку в этом же bat-файле с запоминанием места, откуда был произведен этот вызов:

      call :метка аргументы

Возврат из функции производится командой:

      exit /b [опциональный код возврата]

Ключ /b здесь очень важен: без него будет произведен выход не из функции, а из сценария вообще.

За подробностями обращайтесь к:

      call /?
exit /?

Что интересно, команда call с таким синтаксисом поддерживает рекурсивные вызовы с автоматическим созданием нового фрейма для переменных аргументов %0-%9. Иногда это может быть полезным. Вот классический пример рекурсивного подсчета факториала на командном языке:

      @echo off

call :factorial %1
echo %RESULT%
exit
rem Функция для подсчета значения факториала
rem Вход:
rem       %1        Число, для которого необходимо подсчитать факториал
rem Выход:
rem       %RESULT%  Значение факториала
:factorial

if %1 == 0 (
    set RESULT=1
    exit /b
)

if %1 == 1 (
    set RESULT=1
    exit /b
)

set /a PARAM=%1 - 1

call :factorial %PARAM%

set /a RESULT=%1 * %RESULT%

exit /b

Пример работы:

> factorial.bat 10
3628800

Как можно избежать использования goto?

Любой хоть сколько-то осмысленный *.bat-файл длиной больше 50 строк является ярким лозунгом в поддержку работы Дейкстры «О вреде оператора goto». Мешанина из переходов вперед и назад действительно является кодом «только для записи». Можно ли что-то предпринять по этому поводу?

На самом деле можно. Как правило, большинство меток и переходов используются для организации ветвлений при проверке условий, т.е. банальных if-then-else блоков. В оригинале, bat-язык поддерживал только одну команду в блоке then, что автоматически приводило к идиомам вида:

      if condition goto :THEN
rem Команды ветки ‘else’
rem ...
goto IF_END
:THEN
rem Команды ветки ‘then’
rem ...
:IF_END

Но к счастью, командный интерпретатор cmd.exe современных ОС Windows 2000 и старше поддерживает блоки команд в конструкциях ветвления, что устраняет необходимость применения меток. Блоки команд заключаются в круглые скобки. Выглядит это так (имитируя C/C++ indentation style):

      if condition (
    rem Команды ветки ‘then’
rem ...
) else (
    rem Команды ветки ‘else’
rem ...
)

Конкретный пример использования:

      @echo off

set BUILDMODE=%1

if "%BUILDMODE%" == "" (
    echoFAIL: Аргумент является обязательным ^(--debug, --release^)exit /b 1
)

rem Удаляем из аргумента все дефисы для упрощения обработки
set BUILDMODE=%BUILDMODE:-=%

if "%BUILDMODE%" == "debug" (
    echoINFO: Устанавливаем debug-режим окруженияset CCFLAGS=/Od /MDd /Z7
) else (
    echoINFO: Устанавливаем release-режим окруженияset CCFLAGS=/O2 /MD
)

На мой взгляд, с этим уже вполне можно жить. Но, как всегда, жизнь не так проста, как кажется. Есть одна проблема. Переменные, использующиеся в блоках then и else, раскрываются перед началом выполнения этих блоков, а не в процессе выполнения. В приведенном примере это не вызывает никаких проблем, однако в следующем вызовет:

      if "%BUILDMODE%" == "debug" (
    echoINFO: Устанавливаем debug-режим окружения
set OPTFLAGS=/Od
    set CCFLAGS=%OPTFLAGS% /MDd /Z7
) else (
    echoINFO: Устанавливаем release-режим окружения
set OPTFLAGS=/O2
    set CCFLAGS=%OPTFLAGS% /MD
)

Загвоздка в том, что в обоих блоках подстановка переменной OPTFLAGS произойдет до того, как она будет изменена в процессе выполнения этого блока. Соответственно, в CCFLAGS будет подставлено то значение, которое OPTFLAGS имела на момент начала выполнения данного if-блока.

Решается эта проблема путем использования отложенного раскрытия переменных. Переменные, заключенные в !…! вместо %…%, будут раскрыты в их значения только в момент непосредственного использования. Данный режим по умолчанию отключен. Включить его можно либо использованием ключа /V:ON при вызове cmd.exe, либо использованием команды

      setlocal enabledelayedexpansion

в тексте самого bat-файла. Второй способ мне представляется более удобным – не очень здорово требовать от кого-то запуска твоего сценария с определенным параметром.

С учетом сказанного предыдущий «неправильный» пример может быть исправлен так:

      setlocal enabledelayedexpansion

rem ...
if "%BUILDMODE%" == "debug" (
    echoINFO: Setting up debug mode environment
set OPTFLAGS=/Od
    set CCFLAGS=!OPTFLAGS! /MDd /Z7
) else (
    echoINFO: Setting up release mode environment
set OPTFLAGS=/O2
    set CCFLAGS=!OPTFLAGS! /MD
)

Вот теперь это почти полноценный if-then-else блок. Почти, потому что если в одной из команд echo у вас встретится закрывающая круглая скобка, то вам необходимо заэкранировать ее символом ^, иначе синтаксический анализатор путается…

Но в любом случае, это гораздо лучше безумного количества меток и переходов.

Как обработать текстовый файл?

Иногда в командном файле необходимо получить доступ к содержимому некоторого текстового файла и некоторым образом это содержимое обработать. Например, прочитать файл настроек программы.

Для привнесения еще большей конкретики в процесс изучения зададимся целью прочитать файл с настройками следующего содержания:

      # Это простой файл с настройками

      # Режим сборки
buildmode=release

# Компилятор
compiler=cl.exe

# Архитектура
arch=x86

Ничего сверхъестественного – простой key=value формат с возможностью вставки Unix-style комментариев. Помочь в чтении и обработке этого файла нам сможет команда for. Ее дополнительные опции позволяют задать и разделители, и символ начала комментария, и кое-что еще. Вот командный файл, который выполняет поставленную задачу:

      @echo off

rem Читаем настройки из файла settings.txt, который должен располагаться в
rem том же каталоге, что и bat-файл. Если не удалось распарсить настройки -
rem выходим с ненулевым кодом возврата.
call :read_settings %~dp0\settings.txt || exit /b 1

rem Прочитанные настройки:
echoBuild mode  : %BUILDMODE%echoCompiler    : %COMPILER%
echoArchitecture: %ARCH%
rem Выход из сценария. Дальше - только функции.
exit /b 0

remrem Функция для чтения настроек из файла.
rem Вход:
rem       %1           - Имя файла с настройками
:read_settings

set SETTINGSFILE=%1

rem Проверка существования файла
if not exist %SETTINGSFILE% (
    echoFAIL: Файл с настройками отсутствуетexit /b 1
)

rem Обработка файла c настройками
rem Здесь:
rem     eol=# указывает на то, что содержимое строки начиная с символа #
rem     и до ее конца может быть пропущено как комментарий.
remrem     delims== указывает, что разделителем значений является символ =
remrem     tokens=1,2 приводит к тому, что в переменную %%i будет занесен первый
rem     токен, а в %%j - второй.
remfor /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do (
    rem В переменной i - ключ
rem В переменной j - значение
rem Мы транслируем это в переменные окружения
set %%i=%%j
)

exit /b 0

Обильные комментарии должны помочь легко разобраться, что к чему. За подробностями, как обычно, отошлю к:

      for /?

Кстати, возможности команды for не ограничиваются чтением из файла. Возможно также чтение вывода другой команды. Например, так:

      @echo off

for /f "tokens=* usebackq" %%i in (`cmd.exe /c ver`) do (
    set VERSION=%%i
)

echo%VERSION%

Особенно меня умиляет наличие опции “usebackq”, которая делает синтаксис отдаленно похожим на юниксовый. И в стенах царства Билла есть граждане, скучающие по /bin/sh и пытающиеся хоть как-то скрасить существование свое и окружающих. Следующий совет это также косвенно подтверждает.

Что это за упомянутые ранее операторы объединения команд?

Это операторы &, && и ||. Они практически совсем не освещены в документации, но полезны в повседневности. Они позволяют объединять несколько команд в одну, т.е. примерно так:

command1 & command2
command1 && command2
command1 || command2

Форма этих операторов весьма соответствует их содержанию. В случае, пожалуй, наименее полезного оператора & вторая команда будет просто выполнена после первой, т.е. это равносильно простой записи:

command1
command2

Оператор && гарантирует, что вторая команда будет выполнена только, если первая была выполнена успешно, т.е. с нулевым кодом возврата (он же %errorlevel%). Такие конструкции очень популярны в мире shell-сценариев Unix. Например:

      cd sources && make clean

Я был приятно удивлен, узнав, что cmd.exe тоже умеет выполнять такие конструкции. Это безопаснее и правильнее, нежели простое последовательное выполнение этих команд, и короче и проще, чем строгая проверка и обработка кодов возврата. Очень удобно при написании на скорую руку. Не менее полезен иногда и оператор ||. Суть его тоже логична – выполнить вторую команду, если первая дала сбой. Часто встречается в таких идиомах:

      cd sources || exit 1

Если перейти в каталог sources не удастся, то будет произведен выход с кодом ошибки 1. Если же первая команда отработает нормально, то вторая выполнена не будет. Например, такая простейшая защита помогла бы в случае с cd по UNC-адресу, описанному ранее.



Удаленный рабочий стол RDP в домашней Windows 10 (Home)

Существует много различий между Windows 10 Home и Professional. Функция удаленного рабочего стола является одним из них. В отличие от профессиональной версии, если вы когда-нибудь попробуете использовать функцию удаленного рабочего стола в домашней версии, вы не сможете это сделать. Используя “Подключение к удаленному рабочему столу” вы не можете подключиться к компьютеру на котором установлен Windows 10 Home, но вы можете это исправить. Рассмотрим как добавить RDP в Windows 10 Home.
Компоненты и сервис для RDP-сервера, которые делают возможным удаленное подключение, также доступны в Windows 10 Home. Однако эта функция отключена или заблокирована в домашней версии. Тем не менее, это решение — обходной путь, который исходит от двоичного мастера разработчика в форме библиотеки-оболочки RDP.

Действия по включению функции удаленного рабочего стола Windows 10 Home

Загрузите последнюю версию библиотеки RDP Wrapper с Github
Откройте скачанный архив и распакуйте содержимое в любую папку

Откройте папку с файлами, которые вы распаковали, нажмите на install.bat правой клавишей мыши и выберите “Запуск от имени администратора”. Установка произойдет.

Введите Remote Desktop в поиске, и вы сможете увидеть программное обеспечение RDP.
Введите имя удаленного компьютера и пароль для подключения к компьютеру