Cmd вывести дату в формате

Общие сведения о командном процессоре Windows.

Использование переменных в командных файлах.

Передача параметров командному файлу.

Переходы и метки.

Примеры командных файлов:

    – Своя команда для создания новых файлов.

    – Присвоение съемному диску одной и той же буквы.

    – Создание архива, имя которого содержит дату и время.

    – Выполнение только в заданный интервал времени.

    – Пример создания архива каталога пользователя.

    – Изменение даты и времени для файлов и папок.

    – Запуск и остановка служб Windows в командной строке.

    – Выдача на экран значения ERRORLEVEL.

    – Диалог с пользователем.

    – Задержки в командных файлах.

    – Определение текущей версии Windows.

    – Поиск в локальной сети компьютеров с запущенным приложением.

    – Поиск компьютеров с запущенным приложением по списку на основе сетевого окружения.

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

    – Поиск в локальной сети включенных компьютеров.

    – Работа с дисками, файлами и каталогами.

    – Работа с графическими приложениями из командной строки.

    – Перекодировка текстовых файлов .

    – Часто встречающиеся ошибки при написании командных файлов.

Сеанс по времени, зависящий от региона,

Выходной формат %DATE%
и команды dir
зависит от региона и, следовательно, не является ни надежным, ни умным. date.exe
(часть UnxUtils
) предоставляет любые дату и время в любом воображаемом формате. Вы также можете извлечь информацию о дате/времени из любого файла с помощью date.exe
.

Примеры: (в cmd- script используйте %% вместо%)

date.exe +"%Y-%m-%d"

2009-12-22

date.exe +"%T"

18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"

20091222 185503: Любой текст

date.exe +"Text: %y/%m/%d-any text-%H.%M"

Текст: 09/12/22 – любой текст-18.55

Command: date.exe +"%m-%d """%H %M %S """"

07-22 “18:55:03” `

Информация о дате/времени из справочного файла:

date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Используя его в CMD script, чтобы получить информацию о год, месяц, день, время:

 for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n 

Используя его в CMD script, чтобы получить отметку времени в любом требуемом формате:

 for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i 

Извлечение информации о дате/времени из любого ссылочного файла.

 for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n 

Добавление в файл информации о дате/времени:

 for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt 

date.exe часть бесплатных инструментов GNU
, которые не требуют установки.

ПРИМЕЧАНИЕ. Копирование date.exe
в любой каталог, находящийся в пути поиска, может привести к сбою других сценариев, которые используют встроенную команду date
для Windows.

Присвоение съемному диску одной и той же буквы.

   
Задача заключается в том, чтобы съемный USB диск (флэш диск) был доступен
всегда под одной и той же буквой, независимо от того, на каком компьютере он
используется и каким образом он был подключен. Для ее решения воспользуемся уже упоминаемой выше командой SUBST
, но реализуем присвоение новой буквы диску с
помощью подстановочного значения переменной %0
, создаваемой
системой при каждом запуске командного файла.

Выберем для съемного диска желаемую букву, например – X.

Некоторые из переменных окружения, в том числе и переменная %0
,
принимающая значение пути и имени выполняющегося командного файла, позволяют
при определенной модификации с использованием специального признака –
символа ” ~ ”
, получить ее частичное значение (расширение переменной).
Например, не полный путь
файла, а только его имя, или каталог расположения, или букву диска, с
которого он был запущен или еще около десятка различных элементов, связанных
с подстановочными значениями переменной %0
.

Дополнительное представление о подстановочных значениях
переменной %0 можно получить из командного файла следующего
содержания:

Своя команда для создания новых файлов.

   
В составе операционной системы Windows нет специальной команды для создания нового файла, но без нее можно легко обойтись несколькими способами:

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

COPY CON myfile.txt

При выполнении этой команды данные с клавиатуры (стандартное устройство CON – консоль) будут заноситься в файл myfile.txt текущего каталога. Нажатие клавиши F6 или комбинации CTRL-Z завершит вывод.

При выполнении этой команды будет создан файл myfile.txt, содержащий символ “1”

Комбинация перенаправления ввода и перенаправления вывода:

COPY CON > myfile.txt < xyz

При выполнении этой команды, как и в первом случае, используется копирование
с консоли в файл, но вместо ручного ввода данных с клавиатуры используется ввод с
несуществующего файла (устройства) xyz. Система выдаст сообщение, о том, что такого
устройства или файла
не существует, но пустой файл myfile.txt будет успешно создан.

Обычно, для создания пустого файла используется команда копирования из фиктивного устройства nul
в файл. Использование устройства nul позволяет обойти стандартные операции ввода-вывода, которые для него реально не выполняются. При выполнении копирования с фиктивного устройства в файл будет создан пустой файл без каких-либо сообщений об ошибке.

COPY NUL myfile.txt

   

При работе в командной строке часто приходится создавать новые пустые
файлы, поэтому, стоит подготовить свой командный файл (например, с
именем nf.bat),

а имя нового создаваемого файла передавать ему в качестве параметра при
запуске.

   
Для удобства использования, можно поместить этот командный файл в системный каталог
(например, в C:\windows\system32) или любой другой, существующий в путях
поиска, задаваемых значением переменной PATH). Теперь, в командной строке, находясь в любом каталоге можно одной командой создавать пустые файлы.

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

Расширение командного файла (.bat) можно не набирать и команда еще больше упрощается:

В тексте командного файла присутствует проверка, задано ли имя
создаваемого файла в командной строке (if “%1%” EQU “” goto error), и если не
задано – выводится сообщение об ошибке и командный файл завершает
свою работу.

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

Примеры командных файлов.

   
Использование утилит командной строки и командных файлов нередко позволяют
решить многие проблемы связанные с повседневной эксплуатацией компьютерной
техники. Большинство системных администраторов и грамотных пользователей
продолжают ими пользоваться, несмотря на то, что в Windows проявилось новое,
более мощное и современное средство управления системой – WMI

(Windows Management Instrumentation) и многофункциональная оболочка пользователя Power Shell
. Очевидно, не в последнюю очередь, это
обусловлено простотой реализации и достаточной
эффективностью командной строки для решения повседневных задач обслуживания системы.

Ниже приведены простые
примеры с комментариями, которые демонстрируют некоторые возможности и
способы применения .cmd и .bat

Переходы и метки.

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

Исходные данные: имеется 2 съемных диска, один из которых должен быть виден в проводнике как диск X: , а второй – как диск Y: независимо от того, в какой порт USB они подключены и какие буквы присвоены им операционной системой. Для назначения букв дискам можно воспользоваться командой SUBST
.
Будем считать, что реальные диски могут быть подключены как F: или G:
Опознавание дисков будем выполнять по наличию файла с определенным именем
(лучше всего такой файл сделать скрытым в корневом каталоге съемного диска и назвать его как-нибудь необычно):

Flashd1.let – на первом диске

Flashd2.let – на втором

Таким образом, задача командного файла заключается в том, чтобы проверить
наличие на сменных дисках F:
и G:
файлов Flashd1.let

или Flashd2.let
и, в зависимости от того, какой из них присутствует,
присвоить диску букву X:
или Y:

Для поиска файла на диске воспользуемся командой :

IF EXIST имя_файла команда

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

SUBST X: C:\ –

– создать виртуальный диск
X:, содержимым которого будет корневой каталог диска C:

   
Для решения поставленной задачи, создаем командный файл, например с именем setletter.bat
, следующего содержания:

setletter.bat


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

При выполнении измененного таким образом командного файла, сообщение об
ошибке при выполнении SUBST исчезнет.

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

Одним из важнейших приемов при написании сложных командных файлов
является анализ успешности выполнения конкретной команды или программы.
Признаки ошибок при выполнении команд можно отслеживать, анализируя
специальную переменную
,
значение которой формируется при завершении работы большинства программ.
Обычно ERRORLEVEL равно нулю, если программа завершилась без ошибок и
единице – при возникновении ошибки. Могут быть и другие значения, если они
предусмотрены в выполняемой программе.

   
В качестве команды в строке командного файла можно использовать также
командный файл. Причем, для передачи с возвратом обратно к точке выполнения
вызывающего командного файла используется
команда CALL
. Попробуйте создать командный файл test.bat
, следующего содержания:


– приостановить выполнение командного файла до
нажатия любой клавиши.

Если же в файле test.bat убрать CALL, оставив “1.bat”, то , выполнится командный файл 1.bat, и возврат в test.bat выполняться не будет.

Вызываемый командный файл может создавать переменные и присваивать им
определенные значения, которые будут доступны для обработки в вызывающем
файле. Попробуйте изменить файл test.bat следующим образом:

Переменные вызываемого файла будут доступны в вызывающем файле.

Кстати, используя передачу управления командному файлу, можно организовать
его зацикливание. Попробуйте добавить в конец файла test.bat строку:

Выйти из зацикливания командного файла можно по нажатию комбинации
CTRL+Break
.

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

Передача параметров командному файлу.

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


params.bat FIRST second “two words”

Параметры командной строки, содержащие пробелы должны заключаться в двойные кавычки.

:/>  Все паузы между командами и есть ли горячая клавиша для приостановки выхода из окна CMD во время его работы?

   
При обработке входных параметров необходимо знать, были ли они вообще заданы в командной строке. Для проверки наличия каких-либо входных параметров, передаваемых
командному файлу, можно проверить, является ли значение переменной %1
пустым, что можно сделать, заключив ее, например в двойные кавычки, и проверив полученный результат на наличие этих кавычек, следующих подряд:

REM пробел текст

Строки, начинающиеся с REM пробел
, считаются комментариями и командным процессором игнорируются.

Создание архива, имя которого содержит дату и время.

   
Решим следующую задачу – нужно создать архив файлов, находящихся в каталоге
C:\Program Files\FAR. Имя архивного файла должно состоять из текущего времени
(часы.минуты.секунды – ЧЧ. ММ. СС.rar), и помещен он должен в новый каталог, имя которого должно состоять из текущей даты
(день.месяц.год – ДД. ММ. ГГГГ). Для архивирования будем использовать архиватор RAR.
Формат запуска для создания архива:

RAR a -r < путь и имя архива > < Путь и имя архивируемых данных >

a
– команда создания архива.

-r
– ключ, определяющий архивирование подкаталогов (т.к. в исходной папке есть подкаталоги).

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

  • В командных файлах можно получить доступ к текущей дате и текущему времени – переменные %DATE% и %TIME%
  • В командных файлах можно создавать временные переменные с помощью команды SET.
  • Значение временных переменных может быть сформировано на основе %DATE% и %TIME% путем пропуска и (или) замещения их частей с помощью специальной конструкции с использованием символа ~
    и числового значения, определяющего группу символов из данных текущего значения переменной.

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

    Дата, получаемая из переменной %DATE% при стандартных настройках региональных установок Windows 2000
    выглядит следующим образом:

    Пн 21.01.2005
    – День недели(2 символа)-Пробел(1 символ)-дата(10 символов) – всего 13 символов.

    В Windows XP/Vista/7-10 день недели отсутствует, что несколько упрощает обработку структуры даты.
    Для создания нового каталога в командной строке используется команда

    MD имя каталога
    .

    В нашем примере, имя каталога нужно получить из текущей даты.
    Создаем в памяти временную переменную VDATE и присваиваем ей значение
    переменной окружения DATE, без первых 3-х символов (Пн и пробел) – 20.01.2016:

    В версиях Windows, где в значении принимаемом переменной DATE, отсутствует
    день недели (3 символа – “Пн “), значение VDATE получится не тем, что
    требуется. Чтобы не анализировать признаки наличия данного кода, можно
    воспользоваться и другим вариантом – не пропустить первые 3 символа (~3) от
    начала строки переменной DATE, а взять 10 символов от конца строки, указав число 10 со знаком “минус” – будет тот же результат, например, строка – 20.01.2016

    set VDATE=%date:~-10%

    Создаем каталог на диске C:, имя которого = текущая дата из переменной VDATE:

    MD C:\%VDATE%

    После выполнения этой команды на диске C: будет создан каталог с именем 20.01.2016

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

    MD %DATE:~-10%
    – создать каталог, имя которого будет представлено в виде текущей даты ДД. ММ. ГГГГ

    Время, получаемое из переменной %TIME% выглядит так :

    14:30:59.93
    – Часы, минуты, секунды, сотые доли секунды.

    Сотые доли – это в имени файла архива, пожалуй, лишнее. Поэтому, создаем временную
    переменную VTIME и присваиваем ей текущее время без последних 3-х символов, т.е
    пропускаем 0 символов от начала и отсекаем 3 символа от конца. Количество пропущенных и отсекаемых символов разделяются запятой:

    set VTIME=%time:~0,-3%

    Теперь переменная VTIME принимает значение 14:30:59, но знак двоеточия ( : ) в имени файла использовать нельзя, это специальный символ, использующийся в именах устройств (диск C:\). Поэтому, для получения допустимого имени файла нужно заменить недопустимый символ на любой другой, например, точку. Для замены символов используется знак ” = ”

    set VTIME=%VTIME::=.%
    – заменить в переменной VTIME символ двоеточия на символ точки.

    Переменная VTIME примет значение 14.30.59

    rar.exe a -r C:\%VDATE%\%VTIME%.rar “C:\Program files\far\*.*”

    Теперь можно создать командный файл с содержимым, обеспечивающим архивирование заданного каталога с использованием даты и времени в имени архива:


    set VDATE=%date:~-10%

    md c:\%VDATE%

    set VTIME=%time:~0,-3%

    set VTIME=%VTIME::=.%

    rar.exe a -r C:\%VDATE%\%VTIME%.rar “C:\Program files\far\*.*”

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

    Выполнение каких либо действий в заданный интервал времени.

       
    Речь пойдет не о запуске командного файла в определенное время, а
    о выполнении какой-то его части только в определенный интервал времени,
    например, с 10:00 до 12:00. Решения данной задачи потребует сравнения
    текущего времени с указанным промежутком. Для примера, создадим командный
    файл, выполняющий запуск стандартного калькулятора Windows , только в том
    случае, если он выполняется в интервале времени от 10:00 до 12:00. Необходимо
    получить текущее время и выполнить проверку того, что оно не больше 12:00 и
    не меньше 10:00 .

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

    IF /I строка1 оператор_сравнения строка2 команда

    где оператор_сравнения
    принимает следующие значения:

    EQU
    – равно

    NEQ
    – не равно

    LSS
    – меньше

    LEQ
    – меньше или равно

    GTR
    – больше

    GEQ
    – больше или равно

    а ключ /I
    , если он указан, задает сравнение текстовых строк без учета
    регистра. Этот обычно используется для сравнения текстовых строк в
    форме строка1==строка2
    . Сравнения проводятся по общему типу данных,
    так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в
    числа, после чего выполняется их сравнение. Следовательно, для решения нашей
    задачи нужно сравнить
    строку из первых двух символов значения переменной TIME ( чч:мм:сс )
    с заданным диапазоном :


    REM Время меньше 12:00 – перейти на анализ второго условия, иначе – выход


    if %time:~0,2% lss 12 goto tst2


    if %time:~0,2% gtr 10 goto excalc

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

    Пример создания архива каталога “Мои Документы”.

       
    Этот командный файл создает архивы содержимого папки
    “Мои Документы” пользователей Win2K/XP/7-10, размещая их в каталоги

    C:\ARHIV\Мои документы\Имя пользователя\Дата\время

    Если у вас возникнут проблемы связанные с неверной кодировкой символов
    русского алфавита в именах файлов и каталогов, попробуйте воспользоваться командой
    CHCP
    для смены кодовой страницы

    chcp 866
    – установить кодовую страницу 866 (DOS-кодировка)

    chcp 1251
    – установить кодовую страницу 1251 (Windows-кодировка)

    Этот командный файл можно значительно сократить, убрав ненужные
    переменные VTIME и VDATE, которые в данном примере, используются лишь для того ,
    чтобы скрипт имел более наглядный и простой для понимания вид. Кроме того, имеет смысл воспользоваться более современным бесплатным архиватором, например – 7-Zip.

    В операционных системах Windows XP/Vista/7 формат даты по умолчанию не
    содержит название дня недели. Если есть необходимость получить это значение
    без изменения настроек системы и использования дополнительного программного
    обеспечения, можно воспользоваться сценарием Hindows Script Host (WSH).

    – создаем файл сценария для получения названия дня недели, пусть с именем
    weekday.vbs, и содержащим строку вывода на экран результата выполнения
    функции WeekDayName

    Пример командного файла для получения названия дня недели с
    использованием функции WeekDayName :


    Существуют задачи администрирования, которые решаются значительно проще с использованием сценариев WSH или Power Shell, а не командных файлов CMD Windows.

    Изменение даты и времени файлов или папок.

       
    В Windows, к сожалению, не существует стандартного консольного средства для изменения даты и времени создания, доступа и модификации файлов и папок. Кто имел дело с Unix/Linux знает, что в этих операционных системах имеется простая и удобная утилита
    touch
    с помощью которой можно изменить время последнего доступа или время модификации файла на текущее значение или на значение времени,
    заданное в качестве аргумента командной строки. Если файл не существует, утилита создает пустой файл с указанным именем и устанавливает время создания , последнего изменения, и последнего доступа. Поэтому, нередко touch
    используют для создания пустых файлов.

    Не секрет, что командные оболочки Unix/Linux значительно превосходит по своим возможностям командную строку Windows, поэтому, вполне понятно появление пакета UNIX Shell and Utilities
    для Windows NT и старше. Этот пакет представляет собой Windows-версии наиболее популярных утилит из среды Unix/Linux , которые могут выполняться как консольные команды в среде оболочки пользователя (в среде модуля sh.exe
    , входящего в пакет) или как исполняемые файлы в командной строке Windows. В набор входит
    более 200 программ от компании Mortice Kern Systems (MKS)
    ,
    рекомендуемых Microsoft в качестве средства миграции с Unix на Windows.

    Справку по работе с touch.exe
    можно получить при запуске утилиты с принятым в Unix ключом “–help”

    При этом пользователю выводится краткая подсказка

    Примеры использования утилиты touch.exe
    в командной строке Windows:

    touch C:\folder\myfile.txt
    – изменить время доступа и модификации файла C:\folder\myfile.txt на текущее. Если файл не существует, он будет создан с нулевой длиной и текущим временем создания, модификации и доступа.

    touch C:\folder
    – изменить время доступа и модификации папки C:\folder на текущее.

    touch -f C:\ntldr C:\folder
    – изменить время доступа и модификации папки C:\folder на время, установленное для файла C:\ntldr

    touch -t 199803080102.00 C:\folder
    – установить для существующей папки “C:\folder” значение даты и времени модификации – 1998г., 8 марта, 1 час : 2 минуты :00 секунд

    touch -t 1112.30 C:\folder
    – установить для существующей папки “C:\folder” значение даты и времени модификации – текущая дата, 11 час : 12 минут :30 секунд

    touch -a -t 2222.20 C:\folder
    – изменить только время доступа, время модификации не изменяется.

    setdate.exe -c C:\1.txt 22.11.2016
    – установить для файла C:\1.txt дату создания 22.11.2016

    setdate.exe -m C:\1.txt 22.11.2016
    – установить для файла C:\1.txt дату изменения (модификации) 22.11.2016

    setdate.exe -a C:\1.txt 22.11.2016
    – установить для файла C:\1.txt дату доступа 22.11.2016

    setdate.exe -d C:\1.txt 22.11.2018
    – установить для файла C:\1.txt все даты 22.11.2018

    В версиях Windows 10, вышедших после 2018 года существует возможность использования стандартной подсистемы Windows для Linux (Windows Subsystem for Linux, WSL).
    Пользователь может установить в среде Windows один из дистрибутивов Linux без каких-либо дополнительных средств виртуализации и пользоваться обеими операционными системами одновременно.
    С каждым новым выпуском Windows 10 подсистема WSL становится все более функциональной и удобной. Подробнее –
    Установка и примеры использования подсистемы WSL в Windows 10


    Остановка и запуск системных служб.

    Для остановки и запуска служб из
    командной строки, в любой версии Windows, можно воспользоваться командой NET. EXE



    NET. EXE STOP < имя службы >

    NET. EXE START < имя службы >

    :/>  Все команды для командной строки windows 10



    В качестве параметра команды можно использование как короткое, так и полное имя службы
    (“Dnscache” – короткое, “DNS-клиент” – полное имя службы).
    Имя службы, содержащее пробелы заключается в двойные кавычки.
    Пример перезапуска службы “DNS-клиент”

    net stop “DNS-клиент”

    net start “DNS-клиент”


    Как видно из приведенной таблицы, например IP – адресу 192.168.0.1
    соответствует физический адрес сетевого адаптера, равный 00-1e-13-d6-80-00
    . Если же сетевой адаптер с данным адресом будет недоступен, то такой записи в таблице не будет.

    Для понимания алгоритма опроса сети необходимо учесть следующее:

    Разрешение адресов ARP используется только при передаче данных по IP-протоколу в пределах сегмента локальной сети, задаваемого маской. Так, например, для примера с IP адресом 192.168.0.1 и маски 255.255.255.0 это будет диапазон IP от 192.168.0.1 до 192.168.0.254. Обращение же к любому другому адресу будет выполняться через устройства маршрутизации
    . Т.е. при выполнении команды

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

    Работа с дисками, файлами и каталогами.

       
    Задача – определить буквы дисков, присутствующих в системе и записать результат в файл с
    именем tstdsk.txt текущего каталога. Можно воспользоваться выполнением команды IF EXIST
    в цикле FOR для набора из букв латинского алфавита, т.е
    для каждой буквы диска проверить наличие корневого каталога командой

    IF EXIST буква диска:\

    Сначала создаем пустой файл:

    copy nul tstdsk.txt

    Это действие необязательно, если файла не существует, но в противном случае, результаты будут дописываться в конец файла, и если в нем уже был список дисков от предыдущего исполнения командного файла, то он удвоится. Команда copy nul tstdsk.txt
    для существующего файла установит нулевой размер данных, т.е. сделает его пустым.

    Окончательно, командный файл будет выглядеть следующим образом:

    Для обработки файлов определенного типа, например любых с расширением .tmp
    используется маска – *.tmp . Так, для удаления всех файлов *.tmp из каталога C:\TEMP можно воспользоваться командой ERASE (или DEL )

    ERASE C:\TEMP\*. TMP

    DEL /Q C:\TEMP\*. TMP

    В масках файлов и каталогов возможно использование частичных имен

    ERASE C:\TEMP\A*. TMP – удалить все файлы с расширением . TMP , имя которых начинается с символа “A”

    DIR *u*.* – выдать список всех файлов и подкаталогов текущего каталога, в имени которых содержится символ “u”

    DIR C:\*t.* – выдать список всех файлов и каталогов в корне диска C: , имя которых заканчивается символом “t”

    Задача – получить список всех каталогов с подкаталогами на логическом диске и записать результат в текстовый файл. Для рекурсивной обработки каталогов диска будем использовать команду FOR /R

    Простой пример удаления файлов с расширением .tmp из каталога C:\TEMP:

    FOR /R C:\temp\ %%i IN (*.tmp) DO del %%i

    При выполнении команды возможно использование подстановочных значений переменной цикла для получения имен дисков, папок,
    файлов и их характеристик. Полный список возможных значений в случае использования переменной с именем i

    %%~i – из переменной %i удаляются обрамляющие кавычки (“)

    %%~fi – переменная %i расширяется до полного имени файла

    %%~di – из переменной %i выделяется только имя диска

    %%~pi – из переменной %i выделяется только путь к файлу

    %%~ni – из переменной %i выделяется только имя файла

    %%~xi – из переменной %i выделяется расширение имени файла

    %%~si – полученный путь содержит только короткие имена

    %%~ai – переменная %i принимает значение атрибутов файла

    %%~ti – переменная %i принимает значение даты /времени файла

    %%~zi – переменная %i принимает значение размера файла

    Возможно объединение нескольких операторов :

    %%~dpi – переменная %i заменяется только на имя диска и путь

    %%~nxi – переменная %i заменяется только на имя файла и его
    расширение

    %%~fsIi – переменная %i заменяется только на полный путь с
    краткими именами

    %%~ftzai – переменная %I заменяется на строку, выдаваемую
    командой DIR

    Так же, как и в предыдущем примере, желательно обнулить файл с результатами возможного предыдущего запуска данного командного файла:

    В результате выполнения этого командного файла в корне диска C: будет создан файл dirlist.txt, содержащий список каталогов диска.

    Если в цикле команды FOR /R используются подстановочные значения переменной %%I, то в качестве набора (in) не стоит использовать символ точки.

    Задача – найти на диске файлы с расширением .log и скопировать их в каталог на другом логическом диске – D:\MUSOR

    Желательно проверить наличие каталога D:\MUSOR и при необходимости, создать его командой
    md
    , а также удалить из него все файлы, если они существуют, командой del
    . Затем выполнить переход в корневой каталог диска C: и выполнить в цикле команды FOR поиск файлов по маске *.log
    во всех подкаталогах.

    REM подготовить каталог D:\MUSOR

    if not exist D:\MUSOR md D:\MUSOR

    REM удалить без подтверждения ( /Q) все файлы из каталога

    del /Q D:\MUSOR\*.*

    REM перейти в корень диска C:

    cd c:\

    REM Выполнить проверку наличия файлов с расширением *.log и скопировать их в

    REM D:\MUSOR

    for /R %%i in (c) DO (

    if exist “%%~dpi*.log” copy “%%~dpi*.log” “D:\MUSOR\*.*”

    )

    Практика использования FOR /R показала, что не стоит использовать в качестве набора для обработки символ “точка” ( конструкция in (.)
    ), поскольку при использовании подстановочных значений, можно получить возврат из текущего каталога на уровень выше. В данном примере в качестве набора in используется любой не служебный символ. Команду копирования ( copy ) можно заменить на команду перемещения файлов (MOVE), что приведет к удалению файлов источников после копирования в каталог D:\MUSOR.

    Пример с копированием файлов с расширением .log рассмотренный выше имеет некоторые
    существенные недостатки – не обрабатываются скрытые файлы и папки, и в конечном каталоге,
    куда копируются файлы ( D:\MUSOR ) не создаются подкаталоги с теми же именами, которые принадлежат путям исходных копируемых файлов. Для устранения этих недостатком можно использовать немного другой сценарий :

    Для копирования используется команда xcopy
    с ключами:

    /H
    – копировать скрытые файлы.

    /R
    – разрешение на замену файлов с атрибутом “Только чтение”

    /Q
    – не отображать имена копируемых файлов

    /Y
    – разрешать перезаписывать существующие файлы.

    Подсказку по использованию команды XCOPY
    можно получить при вводе:

    help xcopy

    xcopy /?

    При обработке строки xcopy “%%~dpi*.log” “D:\MUSOR%%~pi*.*” /H /R /Q /Y
    в цикле FOR, в качестве источника копирования будет выбираться C:\текущий путь\*.log
    а в качестве приемника – D:\MUSOR\текущий путь\имя копируемого файла

    Похожий подход можно использовать для обнаружения и копирования исполняемых файлов (*.exe) из каталога временных файлов, задаваемого переменной TEMP. Бывает полезно для поиска вредоносных программ.

       
    При работе с содержимым каталогов удобно использовать команды запоминания текущего каталога и перехода в новый PUSHD
    и команды восстановления ранее запомненного текущего каталога POPD

    Работа с графическими приложениями Windows.

       
    Допустим, вам нужно из одного и того же командного файла запустить notepad.exe
    и cmd.exe. Если просто вставить строки

    notepad.exe

    cmd.exe

    то после запуска notepad.exe выполнение командного файла приостановится и пока не
    будет завершен notepad, cmd.exe не запустится. Самый простой способ обойти эту
    проблему – использовать стандартную команду Windows
    . Полную справку по использованию можно получить по:

    start /?

    Попробуйте создать командный файл следующего содержания:

    start /MAX notepad.exe

    start “This is CMD. EXE” /MIN cmd.exe

    net send %COMPUTERNAME% NOTEPAD and CMD running.

    После выполнения этого командного файла вы увидите стартовавшие, в развернутом окне
    (ключ /MAX) блокнот, в свернутом окне (ключ /MIN) командный процессор CMD. EXE и
    окно с сообщением net.exe. Стандартный заголовок окна cmd.exe заменен на текст
    “This is CMD. EXE”. Обратите внимание на то что заголовок окна можно опускать, но
    особенность обработки входных параметров командой start может привести к
    неожиданным результатам при попытке запуска программы, имя или путь которой содержит
    пробел(ы). Например при попытке выполнить следующую команду:

    start “C:\Program Files\FAR\FAR. EXE”

    Из-за наличия пробела в пути к исполняемому файлу,
    строка для запуска FAR. EXE должна быть заключена в двойные
    кавычки, однако формат входных параметров для start
    предполагает наличие заголовка
    окна, также заключаемого в двойные кавычки, в результате чего “C:\Program Files\FAR\FAR. EXE”
    интерпретируется не как исполняемая программа, а как заголовок окна.
    Для того, чтобы подобного не случилось нужно
    использовать любой, пусть даже пустой, заголовок:

    start “” “C:\Program Files\FAR\FAR. EXE”

       

    Если вам все же потребуется расширенное управление окнами приложений,
    придется воспользоваться сторонним программным обеспечением, например, широко известная утилита cmdow.exe

    Версия cmdow.zip, используемая при написании этой статьи.
    ZIP-архив, закрытый паролем novirus

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

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

    cmdow /?

    Используется около 30 ключей. Описание на русском языке найдете
    здесь.

    Некоторые примеры:

  • Получение информации об окнах:
  • cmdow.exe
    или cmdow.exe > wins.txt
    – выдать информацию обо всех окнах на экран или в файл wins.txt

    cmdow /T
    – выдать информацию об окнах, отображаемых на панели
    задач рабочего стола.

    Информация содержит колонки:

    Handle – дескриптор окна – шестнадцатеричное число, связанное с данным окном.

    Lev – уровень окна. Приложение может быть многооконным с несколькими уровнями окон.

    Pid – идентификатор процесса, породившего окно.

    -Window status- – состояние окна (видимое – Vis, скрытое – Hid, активное – Act,
    свернутое – Min и т.п.

    Image – программа вызвавшая окно.

    Caption – название окна

  • Манипулирование окнами.

  • Если вы хотите, чтобы ваш командный файл выполнялся скрытно,
    добавьте в него строку:

    cmdow @ /HID
    – скрыть текущее окно

    Ниже командный файл с комментариями, демонстрирующий возможности работы cmdow:
    Работает это следующим образом. Из выходных данных CMDOW берется
    первое, второе и 8-е поля.
    Первое – дескриптор окна (Handle), второе – уровень (Lev), третье – имя
    программы (Image). В цикле
    выполняется cmdow и если в ее выводе имеется строка, где имя
    программы IEXPLORE и уровень окна 1 выполняется cmdow <дескриптор> /END
    .
    Пока этот командный файл выполняется, запустить “Обозреватель интернета” не
    получится. А если в начало командного файла добавить “cmdow @ /hid” – то будет
    скрыто и его окно.

    Перекодировка текстовых файлов.

       
    В рассматриваемом примере нужно преобразовать исходный текстовый файл в DOS-кодировке
    в новый текстовый файл в Windows-кодировке.
    В качестве механизма перекодировки используется смена
    кодовой страницы командой CHCP

    и построчная выдача содержимого исходного файла командой ECHO
    с
    перенаправлением вывода в новый файл. Для DOS-кодировки используется
    кодовая страница 866, для Windows-кодировки – 1251. В примере исходный файл
    называется 866.txt, а файл с перекодированными данными – 1251.txt

    Своеобразным современным стандартом программы для перекодировки
    файлов считается, портированная из Unix утилита iconv

    (в составе библиотеки libiconv).

    :/>  Как вывести компьютер из спящего режима по расписанию. Что для этого нужно делать?

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

    Когда задана опция -s
    , сообщения об ошибках не выводятся.

    Ключ -l
    позволяет получить список доступных кодировок. Утилита позволяет
    перекодировать текст, практически, из любой кодировки в любую.

    Часто встречающиеся ошибки при написании командных файлов.

    • Командный файл вручную выполняется успешно, но запущенный с помощью планировщика не работает.

       
    Обычно, это вызвано тем, что вы не учитываете тот факт, что на момент выполнения вашего командного файла переменные среды могут быть совсем другими, чем на момент его написания и запуска из командной строки. Например, в командном файле используется запуск приложения myprog.exe, находящегося в каталоге SCRIPTS на диске D: . Если в командном файле используется имя исполняемого модуля без полного пути

    MYPROG. EXE

    и если каталог D:\SCRIPTS не прописан в путях поиска (переменная PATH ) то модуль MYPROG. EXE может быть найден и выполнен только если текущим каталогом является D:\SCRIPTS. Но если вы укажете полный путь к myprog.exe:

    D:\SCRIPTS\myprog.exe

    то программа будет найдена и выполнена в любом случае.

    Кроме того, нередко программа, указанная в командном файле использует для поиска своих компонент (dll, ini и т.п. ) собственный каталог. Но на момент ее выполнения текущим каталогом может быть любой (чаще всего – системный каталог Windows). Естественно, компоненты не находятся и программа не выполняется. Для устранения проблемы добавьте в командный файл команды, обеспечивающие переход в нужный каталог. Например, программа myprog.exe должна выполняться в каталоге D:\SCRIPTS:

    Rem Сменим текущий диск

    D:

    Rem перейдем в каталог SCRIPTS

    CD D:\SCRIPTS

    myprog.exe

    Также для переходов по каталогам можно воспользоваться командами pushd
    и popd
    , описание и примеры использования которых имеются в разделе Список команд CMD Windows
    .

  • Неправильно отображаются русские имена файлов, служб и т.п.

    Причина в том, что при создании командных файлов вы
    использовали текстовый редактор, в котором русские символы представлены
    не в DOS-кодировке. Если в приведенном выше примере перезапуска службы “DNS-клиент”
    вы используете неверную кодировку, то русская часть имени службы не будет опознана
    из-за неверной кодировки и будет выдано сообщение, что указанная служба не
    установлена. Чтобы избежать проблем с русскими символами в командных файлах,
    используйте редактор с поддержкой DOS-кодировки, например, встроенный редактор
    файлового менеджера Far Manager. Переключение между кодировками в редакторе осуществляется нажатием F8
    . С помощью FAR можно легко осуществлять перекодировку, скопировав (вырезав) текст в буфер обмена, затем
    нажав F8 и вставив текст из буфера.


  • Использование переменных окружения в командных файлах.

       
    При работе с командными файлами невозможно обойтись без переменных окружения (environments)
    – переменных, значения которых определяют среду, в которой выполняются команда или пакетный файл. Часто их называют переменными среды. Значения, принимаемые этими переменными формируются при
    загрузке Windows, регистрации пользователя в системе, старте или завершении
    некоторых приложений, и, кроме того, могут быть заданы с помощью специальной
    команды
    SET переменная = значение

    SETX переменная = значение

    Первая присваивает значение переменной, действующее до завершения текущей сессии командной строки. Вторая – значение, действующее постоянно.

    Как уже упоминалось выше, значение, присвоенное какой-либо переменной, доступно для обработки в командной строке или в командном файле с использованием ее имени, заключенного в знаки процента – %
    . Системные переменные позволяют получить сведения об аппаратной и программной среде, в которой выполняется командный файл, что позволяет реализовать его исполнение на разных компьютерах, независимо от их конкретной конфигурации и пользовательских настроек. Например, в командном файле используется вывод содержимого системного каталога C:\Windows
    :

    DIR C:\Windows

    Алгоритм, реализуемый данным командным файлом, будет прекрасно выполняться до тех пор пока не встретится компьютер с Windows установленной не на диск C:, а например, на D: Чтобы этого не происходило, желательно использовать системную переменную WINDIR
    , принимающую значение пути системного каталога:

    На практике, с помощью команды SET обычно задается и модифицируется путь поиска исполняемых программ
    – переменная окружения PATH
    .

    SET PATH=C:\Windows; C:\windows\system32

    Данная команда определяет, что поиск исполняемых файлов будет выполняться в
    каталоге C:\Windows
    и, если результат неуспешен, в
    C:\windows\system32

    При необходимости выполнить программу, например, myedit.exe
    , размещенную в
    каталоге C:\NewProgs
    необходимо либо указать полный путь исполняемого файла, либо сделать текущим каталогом каталог с программой и использовать только его имя. Если в командной строке не задан полный путь, а только имя
    исполняемого файла – myedit.exe

    то сначала будет выполняться поиск файла myedit.exe
    в текущем каталоге, и если
    он не будет найден – в каталогах, список которых определяется значением переменной
    PATH. Символ ;
    является разделителем элементов в списке путей поиска.
    Если в приведенном примере, текущим каталогом не является
    C:\NewProgs
    , и в остальных каталогах, заданных значением переменной
    PATH, нет исполняемого файла myedit.exe
    , то попытка его запуска
    завершится ошибкой. Однако, если модифицировать значение переменной PATH, добавив в нее требующийся каталог, то указание полного пути исполняемого файла становится необязательным.
    Команда


    изменит текущее значение PATH,
    добавив каталог C:\NewProgs в начало списка. Для добавления каталога в конец списка используется несколько иная конструкция:

    SET PATH=%path%; C:\NewProgs

       
    Выполнение команды SET без параметров позволяет получить текущие
    значения переменных окружения:



    NUMBER_OF_PROCESSORS=1 – количество процессоров

    OS=Windows_NT- тип ОС

    Path=C:\WINDOWS\system32; C:\WINDOWS;C:\Program Files\Far – путь поиска исполняемых файлов.

    PATHEXT=. COM;EXE;BAT;CMD;VBS;VBE; . JS;JSE;WSF;WSH – расширения для исполняемых файлов.

    PROCESSOR_ARCHITECTURE=x86 – архитектура процессора.

    PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD – идентификатор процессора.

    PROCESSOR_LEVEL=6 – уровень (номер модели) процессора.

    PROCESSOR_REVISION =0801 – версия процессора.

    ProgramFiles=C:\Program Files – путь к папке “Program Files”

    PROMPT=$P$G – формат приглашения командной строки $P – путь для текущего каталога $G – знак “>”.

    SystemDrive=C: – буква системного диска.

    SystemRoot= C:\WINDOWS – каталог ОС Windows.

    Значения некоторых переменных по команде SET не отображаются, хотя и присутствуют в системе. В основном, это переменные, принимаемые значения которых динамически изменяются:



    %CD% – Принимает значение строки текущего каталога.

    %DATE% – Принимает значение текущей даты.

    %TIME% – Принимает значение текущего времени.

    %RANDOM% – Принимает значение случайного десятичного числа в диапазоне 1 -32767.

    %ERRORLEVEL% – Принимает текущее значение кода завершения задачи ERRORLEVEL

    %CMDEXTVERSION% – Принимает значение версии командного процессора CMD. EXE для расширенной обработки команд.

    %CMDCMDLINE% – Принимает значение строки, которая вызвала
    командный процессор.

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

    Подробное описание команд с примерами их использования имеется в разделе
    Список команд CMD Windows

    .

    Специальные символы CMD

    Работа с командным процессором предполагает использование двух стандартных устройств – устройства ввода (клавиатура) и устройства вывода (дисплей). Однако, имеется возможность изменить стандартно используемые устройства ввода-вывода с помощью специальных символов – символов перенаправления


    – перенаправление вывода


    – перенаправление ввода

    Для вывода справки не на экран а, например, в файл с именем help.txt, можно использовать следующую команду:

    HELP > help.txt

    При выполнении данной команды, в текущем каталоге будет создан файл с именем help.txt
    , содержимым которого будет результат вывода команды HELP. Если файл help.txt
    существовал на момент выполнения команды, его содержимое будет перезаписано. Для того, чтобы дописать данные в конец существующего файла, используют удвоение символа перенаправления вывода – “>>”

    HELP GOTO > myhelp.txt

    – в файл myhelp.txt
    будет выдана справка по использованию команды GOTO

    HELP COLOR >> myhelp.txt

    – в конец файла myhelp.txt будет дописана справка по использованию команды COLOR

    Простейший пример перенаправления ввода:

    cmd.exe < commands.txt

    – командный процессор не будет ожидать ввода команд с клавиатуры, а считает их из файла commands.txt
    . Фактически, указанный текстовый файл в данном случае является командным файлом.

       
    При запуске командного процессора можно указать конкретную команду в качестве аргумента командной строки:

    cmd.exe /C HELP FOR

    – выполнить команду HELP FOR
    и завершиться (параметр командной строки или ключ /C
    )

    cmd.exe /K HELP FOR

    – выполнить команду HELP FOR
    и перейти в режим ожидания дальнейшего ввода команд (ключ /K
    )

    Подробную справку по использованию cmd.exe можно получить, введя в качестве аргумента ключ /?

    &
    – одиночный амперсанд используется для разделения нескольких команд в одной командной строке.

    команда1 & команда2
    – выполняется первая команда, затем вторая команда.

    &&
    – удвоенный амперсанд между двумя командами, означающий условное выполнение второй команды. Она будет выполнена, если код завершения (или код возврата) первой команды равен нулю, т.е. команда выполнена успешно. Успешность
    выполнения команды определяется значением специальной переменной среды ERRORLEVEL.

    команда1 && команда2
    – выполняется команда1
    , а команда2
    выполняется, только если первая была выполнена успешно.

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

    cmd.exe /C “HELP IF” & ”HELP IF”

    Завершится выполнением первой команды и сообщением об ошибке для второй:


    “”HELP” не является внутренней или внешней
    командой, исполняемой программой или пакетным файлом.

    Как и в любом другом языке программирования, в сценариях CMD невозможно обойтись без переменных. Для получения их значения применяется специальный символ – знак процента %
    . Строка, заключенная в знаки процента интерпретируется как значение переменной, например:

    Символ ^
    , являющийся последним символом строки, используется как признак продолжения предыдущей. Это относится как к тексту, так и к командам.

    Команды CMD

    Строки командных файлов могут содержать как команды самого
    процессора команд CMD, так и имена исполняемых модулей (программ или командных файлов).


    – исполняемый файл ping.exe
    с параметром yandex.ru
    . Расширение .exe
    можно не указывать, и данная команда может быть записана так:

    Список стандартных команд можно получить, введя команду:

    Справочную информацию по конкретной команде можно получить, указав ее название в качестве параметра команды HELP:

    HELP Имя команды

    В русифицированной версии Windows необходимо учитывать, что в среде командного процессора символы национального алфавита отображаются в DOS-кодировке, в соответствии с кодовой страницей (code page) 866
    . При необходимости, для переключения между кодовыми страницами Windows и DOS используется команда

    CHCP номер страницы


    – использовать кодовую страницу 866 (DOS)


    – использовать кодовую страницу 1251 (WINDOWS)

    Внешний вид окна CMD. EXE (консоли Windows) можно изменить с помощью команды

    В качестве аргументов для команды используются 2 шестнадцатеричные цифры, задающие цвет фона и цвет символа.


    – символы белого цвета на черном фоне (используется по умолчанию).


    – черные символы на белом фоне.


    – светло-желтые символы на черном фоне.


    – подсказка для команды COLOR.