Командный файл windows текущий каталог

Командный файл windows текущий каталог

Общие сведения о командных файлах.

Командные файлы – это текстовые файлы с расширением bat или cmd , строки которых представляют собой команды или имена исполняемых файлов. Когда вы запускаете на выполнение командный файл, то управление получает командный процессор операционной системы (часто называемый интерпретатором команд), который последовательно считывает и интерпретирует строки командного файла. Для Windows9X этим занимается command.com , для WinNT/2K/XP – cmd.exe . Строки командных файлов могут содержать команды самого процессора команд (FOR, GOTO, IF и т.п.) или имена исполняемых модулей (net.exe, regedit.exe, win.com и т.п.). В операционных системах WinNT/2K/XP можно получить краткую справку по составу команд с помощью командной строки:

или по конкретной команде:

HELP Имя команды

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

> — перенаправление вывода (или > > — перенаправление в существующий файл, когда выводимые данные дописываются в конец файла.)

Для вывода потока данных команды HELP в файл help.txt командная строка будет следующей:

Для вывода справки по команде GOTO в файл goto.txt:

HELP GOTO > goto.txt

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

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

переменная Имя переменной среды.

строка Строка символов, присваиваемая указанной переменной.

Например, командная строка

добавит переменную myname, принимающую значение Vasya.

Можно получить значение переменной в программах и командных файлах, используя ее имя, заключенное в знаки процента ( %) . Например команда

выведет на экран слово time, а команда

выведет на экран значение переменной time, принимающей значение текущего времени.

А командная строка

добавит в путь поиска исполняемых программ, описываемый значением переменной PATH каталог C:\myprog

Выполнение команды SET без параметров вызывают выдачу текущих значений переменных на экран, в виде:

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

OS=Windows_NT- тип ОС

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

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

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

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

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

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

ProgramFiles=E:\Program Files — путь к папке «Program Files»

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

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

SystemRoot=E:\WINDOWS — каталог ОС Windows.

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

%CD% — Принимает значение строки текущей директории.

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

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

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

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

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

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

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

Входные параметры для командного файла.

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

В самом командном файле первый параметр будет доступен как переменная %1 , второй — %2 и т.п. Имя самого командного файла доступно как переменная %0 . Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных параметров. Обычно для вывода текста используется команда

Однако если текст заменить на %1, — то будет выдан первый параметр, на %2 — второй и т.д.

Создаем файл parm.bat следующего содержания:

echo Первый параметр=%1

echo Второй параметр=%2

echo Третий параметр = %3

и запускаем его на выполнение следующей командой:

parm.bat FIRST second “two words”

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

rem ECHO OFF выключает режим вывода содержания строк командного файла на экран

REM будет выводиться только результат их выполнения.

echo Первый параметр=%1

echo Второй параметр=%2

echo Третий параметр = %3

Попробуйте ECHO OFF заменить на @ECHO OFF – результат говорит сам за себя. Строка, которая выключает режим вывода, перестала выдаваться на экран.

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

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

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

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

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

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

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

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

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

Создаем командный файл setXY.bat со следующими строками:

IF EXIST G:\flashd1.let SUBST X: G:\

IF EXIST F:\flashd1.let SUBST X: F:\

IF EXIST G:\flashd2.let SUBST Y: G:\

IF EXIST F:\flashd2.let SUBST Y: F:\

После выполнения такого файла у вас появятся диски X: и Y: Но если такой файл выполнить повторно, команда SUBST выдаст сообщение об ошибке – ведь диски X: и Y: уже существуют.

Желательно обойти выполнение SUBST, если виртуальные диски X: и Y: уже созданы, (или удалять их, используя SUBST с параметром –d перед подключением ). Модифицируем командный файл с использованием GOTO — передачи управления строке пакетного файла по метке.

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

REM если не существует X: — то перейдем на метку SETX

IF NOT EXIST X:\ GOTO SETX

REM если существует X: — перейдем на проверку наличия Y:

IF EXIST G:\flashd1.let SUBST X: G:\

IF EXIST F:\flashd1.let SUBST X: F:\

REM если Y: существует – завершим командный файл.

IF EXIST Y:\ GOTO EXIT

IF EXIST G:\flashd2.let SUBST Y: G:\

IF EXIST F:\flashd2.let SUBST Y: F:\

REM выход из командного файла

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

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

ECHO Вызов 1.bat

И файл 1.bat, содержащий команду PAUSE , приостанавливающую выполнение командного файла до нажатия любой клавиши.

При выполнении test.bat будет выдано на экран сообщение

и управление получит 1.bat с командой pause. После начатия клавиши на клавиатуре управление получит командная строка “ECHO Возврат.” и на экран будет выдано

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

Выйти из зацикливания командного файла можно по нажатию комбинации CTRL-Break. Возможно использование команды CALL для вызова процедуры внутри командного файла. В этом случае в качестве аргумента используется не имя внешнего файла, а метка:
.
call :proc1
.
:proc1
.
exit
.

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

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

COPY CON myfile.txt

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

ECHO 1 > myfile.txt

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

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

COPY CON > myfile.txt nul в файл.
copy nul myfile.txt

Если вам часто приходится создавать пустые файлы, можно подготовить свой командный файл (например – newfile.bat или, что еще короче — nf.bat), а имя создаваемого файла передавать ему в качестве параметра при запуске.

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

Читайте также:  Acer aspire m3970 драйвера windows 10

или
nf myfile.txt

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

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

d0. Создаем командный файл следующего содержания:
@echo off
subst X: %

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

@echo off
ECHO ОБРАБАТЫВАЕТСЯ ФАЙЛ — %0
ECHO Дата/время создания/изменения командного файла — %

t0
ECHO Путь командного файла — «%

f0″
ECHO Диск командного файла — %

d0
ECHO Каталог командного файла — «%

p0″
ECHO Имя командного файла — %

n0
ECHO Расширение командного файла — %

x0
ECHO Короткое имя и расширение — %

s0
ECHO Атрибуты командного файла — %

a0
ECHO Размер командного файла — %

Создание поколений архивов по датам и времени.

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

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

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

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

    Дата, получаемая из переменной %DATE% при стандартных настройках региональных установок выглядит следующим образом:
    Пн 21.01.2005 — День недели(2 символа)-Пробел-дата(10 символов)
    Для примера, создадим каталог командой MD .
    Создаем в памяти временную переменную VDATE и присваем ей значение переменной окружения DATE, без первых 3-х символов — 20.01.2005:

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

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

    Время, получаемое из переменной %TIME%:
    14:30:59.93 — Часы, минуты, секунды, сотые доли секунды.
    Сотые доли — это в имени файла архива, пожалуй, лишнее. Создаем временную переменную VTIME и присваиваем ей текущее время без последних 3-х символов
    set VTIME=%time:

    0,-3%
    Теперь VTIME = 14:30:59, но знак » : » в имени файла использовать нельзя, поэтому заменим его на точку.
    set VTIME=%VTIME::=.%
    Переменная VTIME примет значение 14.30.59 Для имени файла сойдет.

    rar a -r C:\%VDATE%\%VTIME%.rar «C:\Program files\far\*.*»

    Теперь можно создать командный файл с содержимым:

    3%
    md c:\%VDATE%
    set VTIME=%time:

    0,-3%
    set VTIME=%VTIME::=.%
    rar a -r C:\%VDATE%\%VTIME%.rar «C:\Program files\far\*.*»

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

    Создание архивов с использованием переменных профиля пользователя.

    Этот командный файл создает архивы содержимого папки «Мои Документы» пользователей Win2K/XP, размещая их в каталоги
    C:\ARHIV\Мои документы\Имя пользователя\Дата\время

    Используются переменные USERPROFILE, USERNAME, WINDIR, поэтому в WIN9X этот командный файл работать не будет. (Хотя, при желании вы можете вставить в autoexec.bat команды для установки значений этих переменных и использовать его в однопользовательском варианте практически без изменений). Содержимое командного файла снабжено комментариями и не должно вызывать особых затруднений, если вы разобрались с предыдущим примером:

    @echo off
    rem Задается переменная FROM — откуда брать данные для архивирования
    set FROM=%USERPROFILE%\Мои Документы
    rem Задается ппеременная TO — куда помещать архивы
    set TO=C:\arhiv\Мои документы\%USERNAME%
    rem Создадим каталог ТО
    md «%TO%\»
    rem Сформируем имя подкаталога из текущей даты
    rem текущая дата при настройках по умолчанию для Win2K — Пн 25.04.2005
    rem текущая дата при настройках по умолчанию для WinXP — 25.04.2005
    rem Из текущей даты сформируем имя подкаталога — 25.04
    rem По умолчанию Windir для WinXP — C:\WINDOWS, а для Win2K — C:\WINNT
    IF /I %Windir% == C:\WINNT GOTO Win2K
    set vdate=%DATE:

    0,-5%
    GOTO SetFileName
    :Win2K
    set vdate=%DATE:

    3,-5%
    rem Сформируем имя файла архива из текущего времени — 12:00:00.99
    rem отбросим сотые доли секунды и заменим символ : на символ . Результат — 12.00.00
    :SetFileName
    set vtime=%TIME:

    0,-3%
    set vtime=%vtime::=.%
    rem Создадим подкаталог для файла архива
    md «%TO%\%VDATE%»
    rem Команда для архивирования. Ключ -r нужен для архивирования с вложенными папками
    rem вариант для архиватора ARJ : arj a -r «%TO%\%VDATE%\%VTIME%.arj» «%FROM%\*.*»
    rem При использовании архиватора RAR:
    rar a -r «%TO%\%VDATE%\%VTIME%.rar» «%FROM%\*.*»

    Выполнение команд по расписанию.

    В WIN2K/XP существует утилита командной строки AT , позволяющая выполнить команду или пакетный файл в указанное время на локальном или удаленном компьютере. Для использования команды AT необходимо, чтобы была запущена служба планировщика заданий (обычно запущена по умолчанию при установке системы).

    AT [\\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]]

    AT [\\имя_компьютера] время [/INTERACTIVE]

    [ /EVERY:день[. ] | /NEXT:день[. ]] «команда»

    \\имя_компьютера Имя удаленного компьютера. Если этот параметр опущен,

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

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

    /delete Отмена запланированной задачи. Если код задачи опущен,

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

    /yes Отмена запроса на подтверждение при отмене всех

    время Время запуска команды.

    /interactive Разрешение взаимодействия задачи с пользователем,

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

    /every:день[. ] Запуск задачи осуществляется по указанным дням недели или

    месяца. Если дата опущена, используется текущий день

    /next:день[. ] Задача будет запущена в следующий указанный день недели

    (например в следующий четверг). Если дата опущена,

    используется текущий день месяца.

    «команда» Команда или имя пакетного файла.

    — Аналог “будильника” , — всплывающие окна с текстом, напоминающие текущему или указанному пользователю о необходимости выполнения каких-нибудь действий. Для отправки сообщения пользователю используем утилиту NET.EXE

    AT 13:50 net.exe send * Пора пить кофе

    AT 17:50 net.exe send User Пора домой

    AT \\SERVER 13:45 net.exe send Нужно перезагрузить сервер

    — Просмотр списка запланированных задач:

    — Удаление уже спланированных задач:

    AT 3 /DELETE – удаление задачи с номером 3

    AT /DELETE /YES – удаление всех задач

    “Панель управления” — “Назначенные задания” позволяют просматривать, изменять и удалять созданные командой AT задания.

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

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

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

    net stop «DNS-клиент»

    net start «DNS-клиент»

    То же, с использованием короткого имени:

    net stop Dnscache

    net start Dnscache

    Полное имя службы можно скопировать из “Службы” – — “Свойства” — “Выводимое имя”

    Для управления службами гораздо удобнее воспользоваться утилитой PsService.exe из утилит PsTools Утилита не требует установки и работает в любой OS Windows. Кроме запуска и остановки службы, позволяет выполнить поиск конкретной службы на компьютерах локальной сети, опросить состояние и конфигурацию службы, изменить тип запуска, приостановить службу, продолжить, перезапустить.

    Для работы с системными службами в Windows XP/7/8 можно использовать утилиту sc.exe , позволяющую не только остановить/запустить службу, но и опросить ее состояние, параметры запуска и функционирования, изменить конфигурацию, а также работать не только с системными службами, но и с драйверами. При наличии прав, имеется возможность управлять службами не только на локальной, но и на удаленной машине. Примеры:
    sc.exe stop DNSCache — остановить службу DNSCache на локальном компьютере.
    sc \\192.168.0.1 query DNSCache — опросить состояние службы DNSCache на компьютере c IP-адресом 192.168.0.1
    sc \\COMP start DNSCache запустить службу DNSCache на компьютере COMP
    Подсказку по работе с утилитой можно получить, введя:
    sc /?

    Выдача на экран значения переменной ERRORLEVEL .

    Этот простенький командный файл выдаст на экран значение переменной ERRORLEVEL по конкретной командной строке. Вначале выполняется проверка на наличие хотя бы одного входного параметра, и если ничего не задано, выдается сообщение об ошибке и происходит завершение по exit. Если же хотя бы один параметр задан, то входные параметры считаются командной строкой и выполняются, а значение ERRORLEVEL выдается с помощью команды ECHO. Содержимое файла (я назвал его echoEL.bat):

    @echo off
    if «%1» NEQ «» GOTO PARMOK
    ECHO Нужно задать командную строку для определения ERRORLEVEL
    exit
    :PARMOK
    %1 %2 %3 %4 %5 %6 %7 %8
    ECHO %1 %2 %3 %4 %5 %6 %7 %8 ERRORLEVEL=%ERRORLEVEL%

    Примеры запуска:
    echoEL.bat NET SHARE
    — будет выполнена команда NET SHARE (выдать список разделяемых сетевых ресурсов) и выдан код ERRORLEVEL
    echoEL.bat NET SHARE X»=»C:\
    — будет выполнена команда NET SHARE X:=C:\ (создать разделяемый сетевой ресурс с именем X, и путем в корневой каталог диска C:) Обратите внимание на то, что символ = заключен в двойные кавычки.
    Перечисленные выше варианты задают корректную командную строку. Но попробуйте задать неверный параметр для NET.EXE или вообще несуществующую команду и вы увидите, какое значение примет ERRORLEVEL. И УЧТИТЕ, что командная строка реально ВЫПОЛНЯЕТСЯ и, например, вариант «echoEL.bat format A:» запустит форматирование дискеты в дисководе A:.

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

    Для диалога с пользователем можно использовать команду:
    SET /P =
    при выполнении которой, на экран выдается текстовое сообщение и ожидается ввод ответного текста. Пример — выполним запрос пароля и присвоим его значение переменной «pset»:

    set /p pset=»Enter password — »
    echo Password is — %pset%

    Недостатком данного способа является невозможность продолжения выполнения командного файла при отсутствии ответа пользователя, поэтому очень часто вместо set используются сторонние программы. Одна из них — CHOICE.COM Скачать (1.7кб).
    CHOICE выдает пользователю текстовое сообщение и ожидает выбора одного из заданных вариантов ответа (нажатия клавиш на клавиатуре). По результатам выбора формируется переменная ERRORLEVEL, значение которой равно порядковому номеру выбора. По умолчанию вариантов выбора два — Y или N. Если ответ равен Y — то ERRORLEVEL=1, если N — то ERRORLEVEL=2. Можно использовать более 2-х вариантов выбора и есть возможность задать выбор по умолчанию, когда пользователь за определенное время не нажал ни одной клавиши. Формат командной строки:

    CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]
    /C[:]choices — определяет допустимые варианты выбора. Если не задано — YN
    /N — не выдавать варианты выбора.
    /S — строчные и заглавные буквы отличаются.
    /T[:]c,nn — Выбор по умолчанию равен «c» через «nn» секунд
    text — Строка текста выводимая в качестве запроса

    Создадим командный файл, демонстрирующий использование CHOICE. Он будет реагировать на нажатие клавиш «1»,»2″,3″ и «0» . При нажатии «0» выполняется завершение, а при нажатии остальных — сообщение пользователю. Если в течении 10 секунд ничего не нажато — завершение.

    @ECHO OFF
    :CHOICE
    CHOICE /C:1230 /T:0,10 Ваш вариант
    IF %ERRORLEVEL% EQU 4 GOTO EXIT
    echo Ваш выбор=%ERRORLEVEL%
    GOTO CHOICE
    :EXIT

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

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

    Когда-то, еще в DOS, для организации ожидания в командном файле использовалась удобная команда SLEEP, но затем она почему-то перекочевала из стандартного установочного набора Windows в дополнительный Resource Kit. Можно просто скопировать его оттуда в каталог \system32 и использовать в ваших командных файлах.

    : SLEEP N — где N — количество секунд для задержки.

    Если же Resource Kit нет под рукой, можно воспользоваться ранее рассмотренной командой CHOISE без вывода текста и с автоматическим формированием ответа через nn секунд (1-99):

    choice.com /T:y,10 /N — задержка на 10 секунд

    Более универсальный способ основан на пинговании петлевого интерфейса нужным количеством пакетов. Пинг для петлевого интерфейса (имя хоста — localhost или IP- адрес 127.0.0.1) выполняется без реальной передачи данных, т.е. практически мгновенно, а интервал между пингами составляет 1 секунду. Указывая количество пингов с помощью ключа «-n» можно получить задержку на n секунд:

    ping 127.0.0.1 -n 30 > nul — даст задержку на 30 секунд

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

    Для реализации этого скрипта используются утилиты из пакета PSTools (краткое описание). Создадим командный файл, выполняющий поиск в локальной сети компьютеров с выполняющейся программой, имя которой (начальная часть имени) задается в качестве параметра при запуске, например, game . При обнаружении будет послано сообщение на компьютер ADMINCOMP и обнаруженное приложение будет принудительно завершено. Для поиска будем использовать утилиту Pslist.exe и анализировать ее код возврата. Значение переменной ERRORLEVEL равное нулю означает, что утилита обнаружила на удаленном компьютере процесс, удовлетворяющий условиям поиска. Имя процесса для поиска будем задавать в качестве параметра при запуске командного файла. Присвоим нашему командному файлу имя psl.bat . Запуск с параметром будет выглядеть следующим образом:
    psl.bat game
    Для начала, нужно проверить, задан ли параметр в командной строке при запуске, и, если не задан, выдадим сообщение пользователю и завершим выполнение. Если же параметр задан — перейдем на метку » PARMOK «:
    @echo off
    if «%1» NEQ «» GOTO PARMOK
    ECHO Нужно задать имя процесса для поиска
    exit
    :PARMOK

    Теперь нужно обеспечить последовательное формирование IP-адресов компьютеров для командной строки PSlist. Проще всего это сделать с помощью присвоения временной переменной окружения (действительной только на время выполнения командного файла) значения постоянной составляющей адреса (например — 192.168.0.) и вычисляемого значения младшей части (например, в диапазоне 1-254). Для примера будем считать, что нам необходимо просканировать компьютеры в диапазоне адресов:
    192.168.0.1 — 192.168.0.30:
    set IPTMP=192.168.0. — старшая часть адреса
    set /A IPLAST=1 — младшая часть. Ключ /A означает вычисляемое числовое выражение
    set IPFULL=%IPTMP%%IPLAST% — значение полного IP-адреса.
    Командная строка для PSlist будет выглядеть cледующим образом:
    pslist \\%IPFULL% %1
    Теперь осталось только циклически запускать PSlist, прибавляя в каждом цикле единицу к младшей части адреса, пока ее значение не достигнет 30 и анализировать значение ERRORLEVEL после выполнения. Для анализа результата будем выполнять переход командой:
    GOTO REZULT%ERRORLEVEL%
    обеспечивающей переход на метку REZULT0 при обнаружении процесса и на REZULT1 — при его отсутствии.
    Окончательное содержимое командного файла:

    @echo off
    if «%1» NEQ «» GOTO PARMOK
    ECHO Нужно задать имя процесса для поиска
    exit
    :PARMOK
    set IPTMP=192.168.0.
    rem Зададим начальное значение » хвоста » IP- адреса
    set /A IPLAST=1
    rem M0 — метка для организации цикла
    :M0
    rem Переменная IPFULL — полное значение текущего IP-адреса
    set IPFULL=%IPTMP%%IPLAST%
    rem Если » хвост «больше 30 — на выход
    IF %IPLAST% GTR 30 GOTO ENDJOB
    pslist \\%IPFULL% %1
    GOTO REZULT%ERRORLEVEL%
    :REZULT0
    rem Если найдено приложение- отправим сообщение на ADMINCOMP
    net send ADMINCOMP Запущено %1 — %IPFULL%
    rem И завершим приложение с помощью PSkill
    pskill \\%IPFULL% %1
    :REZULT1
    rem Сформируем следующий IP-адрес
    set /A IPLAST=%IPLAST% + 1
    rem Перейдем на выполнение следующего шага
    GOTO M0
    rem Завершение работы
    :endjob
    exit

    В заключение добавлю, что для того, чтобы этот скрипт работал, PSlist.exe и PSkill.exe должны быть доступны в путях поиска исполняемых файлов, например в каталоге WINDOWS. Пользователь, запускающий его, должен обладать правами администратора по отношению к сканируемым компьютерам. И, если текущий пользователь таковым не является, то в параметры запуска утилит PSlist.exe и PSkill.exe нужно добавить ключи, задающие имя пользователя и пароль.

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

    В предыдущем примере использовался прямой перебор IP-адресов компьютеров в локальной сети, что не всегда удобно, поскольку в процедуру опроса оказываются вовлечены и выключенные компьютеры. Решим задачу другим способом. Создадим текстовый файл со списком компьютеров и опросим их по этому списку.
    Список можно получить из сетевого окружения с использованием команды:
    net.exe view > comps.txt
    После выполнения такой команды файл comps.txt будет содержать список следующего вида:

    Обрабатывать содержимое этого текстового файла будем с помощью команды FOR с ключом /F:

    FOR /F [«ключи»] %переменная IN (имя файла) DO команда [параметры]

    Данная команда позволяет получить доступ к строкам в текстовом файле с использованием ключей:
    skip=n — пропустить n строк от начала файла (в нашем случае — 4 строки)
    eol= — не использовать строки, начинающиеся с заданного символа. (в нашем случае — пропустить последнюю строку, начинающуюся с символа «К» — «Команда выполнена успешно»
    tokens=n — брать для обработки n-е слово в строке (в нашем случае — 1-е слово)

    Окончательный вид команды:

    FOR /F «eol=К skip=4 tokens=1 » %%I IN (comps.txt) DO (
    pslist.exe -u admin -p pass %%I %1
    IF NOT ERRORLEVEL 1 net.exe send ADMINCOMP %%i %1
    )

    Обратите внимание — в пакетных файлах для переменных команды FOR используется два знака процента (запись %%переменная вместо %переменная ) и имена переменных учитывают регистр букв ( %i отличается от %I ).
    Работать это будет следующим образом — пропускаются первые 4 строки текстового файла со списком компьютеров, и далее в цикле переменной I присваивается значение первого слова (текст от начала строки до разделителя — пробела), выполняется утилита PSlist.exe, для которой в качестве имени компьютера используется значение этой переменной. Если ERRORLEVEL менее 1 — задача с искомым именем присутствует в списке процессов и выполняется отправка сообщения с помощью NET SEND.
    Окончательное содержимое командного файла:

    @echo off
    if «%1» NEQ «» GOTO PARMOK
    ECHO Нужно задать имя процесса для поиска
    exit
    :PARMOK
    REM
    REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET VIEW
    net view /DOMAIN:MyDomain > comps.txt
    REM
    REM FOR /F «параметры» — использование данных из файла
    REM eol=К — не использовать строки, начинающиеся с «К» — «Команда выполнена успешно»
    REM skip=4 — пропустить первые 4 строки в файле
    REM tokens=1 — брать для обработки 1-е слово в строке
    REM
    FOR /F «eol=К skip=4 tokens=1 » %%i in (comps.txt) do (
    pslist.exe -u admin -p pass %%i %1
    IF NOT ERRORLEVEL 1 net.exe send %COMPUTERNAME% Компьютер — %%i процесс — %1
    )

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

    Предыдущий пример натолкнул меня на мысль сделать пакетный файл для быстрого выключения всех компьютеров в сети. Выключение производится утилитой PsShutdown.exe (описание в статье «Утилиты пакета PSTools»). Как и в предыдущем примере, сначала создается файл со списком компьютеров на основе сетевого окружения, а затем выполняется их поочередное выключение, при условии, что компьютер не свой (иначе он может выключиться до окончания выполнения командного файла). Содержимое файла:

    rem @echo off
    REM Здесь нужно задать
    REM имя домена или рабочей группы для которых строится список машин для выключения
    set MyDomain=имя домена
    REM
    REM Создадим текстовый файл comps.txt со списком компьютеров с помощью NET VIEW
    net view /DOMAIN:%MyDomain% > comps.txt
    REM
    REM FOR /F «параметры» — использование данных из файла
    REM eol=К — не использовать строки, начинающиеся с «К» — «Команда выполнена успешно»
    REM skip=4 — пропустить первые 4 строки в файле
    REM tokens=1 — брать для обработки 1-е слово в строке
    FOR /F «eol=К skip=4 tokens=1 » %%i in (comps.txt) do (
    REM Свой компьютер выключать не будем
    REM Если имя компьютера не равно COMPUTERNAME — выключаем
    IF /I %%i NEQ %COMPUTERNAME% psshutdown -k -t 0 %%i
    )

    Вам нужно только подредактировать строку:
    set MyDomain=
    указав имя домена и, при необходимости, добавить параметры -u -p для psshutdown.exe .
    Один из посетителей этой странички (спасибо, Danila17) подсказал мысль о том, что, как правило, в реальной жизни из списка выключаемых компьютеров нужно исключить несколько штук, для чего удобно использовать команду FIND в цепочке с net.exe в скрипте формирования списка на основе сетевого окружения. Данная команда используется для поиска строк в текстовом файле по шаблону. Ключ /V используется для поиска строк не совпадающих с шаблоном. Для выключения компьютеров, исключая server1. server4 удобно использовать такой вариант:

    net view | find «\\» | find /v «сервер1» | find /v «сервер2» | find /v «сервер3» | find /v «сервер4» > comps.txt
    FOR /F «tokens=1 » %%i in (comps.txt) do shutdown.exe -f -s -m %%i

    Работа с оконными приложениями.

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

    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.exe может привести к неожиданным результатам при попытке запуска программы, имя или путь которой содержит пробел(ы). Например при попытке выполнить следующую команду:
    start «C:\Program Files\FAR\FAR.EXE»
    Из-за наличия пробела в пути к исполняемому файлу, строка для запуска FAR.EXE должна быть заключена в двойные кавычки, однако формат входных параметров для start.exe предполагает наличие заголовка окна, также заключаемого в двойные кавычки, в результате чего «C:\Program Files\FAR\FAR.EXE» интерпретируется не как исполняемая программа, а как заголовок окна. Для того, чтобы подобного не случилось нужно использовать любой, пусть даже пустой, заголовок:
    start «» «C:\Program Files\FAR\FAR.EXE»

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

    15кб
    Сайт разработчика
    Из-за специфического поведения эта утилита большинством антивирусов определяется как вирус, поэтому для нормальной работы нужно занести ее в исключения антивируса.
    Cmdow.exe — крошечная утилита, работающая в Windows NT4/2000/XP/2003 без установки. Позволяет получить список окон, перемещать, изменять размеры, переименовывать, сворачивать/разворачивать, активировать/деактивировать, закрывать, скрывать окна приложений и многое другое. Справку можно получить по команде:
    cmdow /?
    Используется около 30 ключей. Описание на русском языке найдете здесь. Некоторые примеры:

    Получение информации об окнах:

    cmdow.exe или cmdow.exe > wins.txt — выдать информацию обо всех окнах на экран или в файл wins.txt
    cmdow /T — выдать информацию об окнах, отображаемых на панели задач рабочего стола.
    Информация содержит колонки:

    Handle — дескриптор окна — шестнадцатеричное число, связанное с данным окном.
    Lev — уровень окна. Приложение может быть многооконным с несколькими уровнями окон.
    Pid — идентификатор процесса, породившего окно.
    -Window status- — состояние окна (видимое — Vis, скрытое — Hid, активное — Act, свернутое — Min и т.п.
    Image — программа вызвавшая окно.
    Caption — название окна

    Манипулировать окнами можно используя название окна, или его дескриптор. Если название окна содержит пробелы, то оно заключается в двойные кавычки. Если имеются русские буквы, то должна использоваться DOS-кодировка. Символ @ используется для указания текущего окна. Иногда проще использовать дескриптор окна, а не его название. Полезным может быть и использование команды поиска по строке find.exe, выполняемой в цепочке с cmdow:
    cmdow.exe | find.exe /I «hid» > wins.txt — в файл wins.txt попадут только строки содержащие шаблон «hid» и мы получим список скрытых окон.
    cmdow.exe | find.exe /I «MyIE» > wins.txt — список окон приложения MyIE

    Манипулирование окнами.
    Если вы хотите, чтобы ваш командный файл выполнялся скрытно, добавьте в него строку:
    cmdow @ /HID — скрыть текущее окно
    Ниже командный файл с комментариями, демонстрирующий возможности работы cmdow:

    @ECHO OFF
    REM Свернуть все окна — /MA
    cmdow /MA
    REM запустить cmd.exe с заголовком окна MyCMD
    start «MyCMD» cmd.exe
    REM ждать 5 секунд
    call :wait5s
    REM
    :M1
    REM Скрыть окно MyCND
    cmdow MyCMD /hid
    call :wait5s
    REM Сделать видимым
    cmdow MyCMD /vis
    call :wait5s
    REM Переместить в верхний левый угол экрана и развернуть окно
    cmdow MyCMD /MOV 0 0
    cmdow Mycmd /max
    call :wait5s
    REM Изменить размер на 320 х 240 и переместить вправо на 320 точек
    cmdow MyCMD /MOV 320 0 /SIZ 320 240
    call :wait5s
    REM Переместить окно в точку с координатами 320 x 240 и изменить размер на 350×50
    cmdow MYCMD /MOV 320 240 /SIZ 350 50
    call :wait5s
    REM Восстановить окно
    cmdow MYCMD /RES
    call :wait5s
    REM Восстановить и сделать активным окно этого командного файла
    cmdow @ /RES /ACT
    ECHO Для завершения нажмите CTRL-C (CTRL-Break)
    call :wait5s
    call :wait5s
    REM Зацикливание — переход к метке :M1
    GOTO M1
    REM Подпрограмма задержки на 5секунд
    :wait5s
    @ping -n 5 localhost > nul

    Пример командного файла, закрывающего окна Проводника Интернет (IEXPLORE.EXE):

    @echo off
    :M1
    for /f «tokens=1-2,8» %%a in (‘cmdow’) do (
    if /i «%%c»==»IEXPLORE» if «%%b»==»1» cmdow %%a /END > nul
    )
    goto M1

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

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

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

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

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

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

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

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

    Прием со сменой каталога наиболее универсален и, как правило всегда срабатывает.

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

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

    • Скрипт нормально работает на одном компьютере, но на другом — не срабатывает.

    Обычно это вызвано применением в командных файлах абсолютных значений вместо переменных среды окружения. Вместо C:\WINDOWS правильнее использовать %SYSTEMROOT%, потому, что на другом компьютере система может быть установлена в другой каталог или на другой диск. Старайтесь вместо имени командного файла использовать переменную %0 и ее подстановочные варианты (%

    d0 — диск с которого запущен сценарий, %

    dp0 — полный путь и т.д.).

    Строки с переменными, принимающими значения имен файлов и каталогов лучше заключать в кавычки. Командная строка
    DIR %ProgramFiles%
    не выдаст вам содержимого каталога C:\Program Files , поскольку из-за наличия пробела будет интерпретирована как
    DIR C:\Program
    Командная строка
    DIR «%ProgramFiles%»
    выполнится верно.

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

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

    Командные файлы удобно использовать для выполнения каких-либо действий при регистрации пользователя в домене. Делается это с помощью вкладки «Profile» свойств пользователя домена.

    Сами командные файлы скриптов должны находиться в сетевой папке Netlogon (для Win2k — это папка WINNT \ SYSVOL \ DOMAIN \ SCRIPTS) контроллера домена, доступ на чтение к которой должен быть у всех пользователей, проходящих регистрацию.

  • Оцените статью