Урок 8 по CMD - цикл for, работа с папками и подпапками. Работа с cmd файлами


Урок 8 по CMD - цикл for, работа с папками и подпапками

В этой статье мы рассмотрим как используется цикл for в командной строке (cmd) для групповой работы с каталогами. Как уже упоминалось, логику работы cmd цикла можно менять с помощью ключей, так, для обработки каталогов применяется ключ /D.

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

Фактически, с помощью цикла cmd for можно получить слепок всего дерева каталогов для заданного диска, и в групповом порядке их обработать.

Cmd цикл for – обработка корневых и вложенных папок

Для работы с каталогами цикл принимает следующий вид:

for /D %%переменная in (набор_каталогов) do (оператор)

Фактически, тут логика работы аналогична той, что используется при работе с файлами. Переменная набор_каталогов содержит путь к папке, содержимое которой нужно обработать. Только помните, что в данном случае мы получаем не список файлов, а каталогов. Мы также можем указать шаблон для поиска:

@echo off for /d %%B in (%SystemRoot%\*) do echo %%B

В данном случае функция echo выведет список всех папок, которые есть в системном каталоге (путь к нему, хранится в переменной (%SystemRoot%). Или такой вариант:

@echo off for /d %%B in (%SystemRoot%\S*) do echo %%B

Тут мы получим список лишь тех папок, имена которых начинаются на S.

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

@echo off for /D %%B in (%SystemRoot%\* %TEMP%\*) do echo %%B

Тут происходит вывод всех папок из системной и временной папки (переменная окружения %TEMP%).

А вот такая запись:

for /d %%B in (%SystemRoot%) do echo %%B

выведет путь к системному каталогу, заданному в переменной окружения %SystemRoot%. Аналогичный результат можно получить прописав:

или

в первом случае мы используем функцию echo, а во втором ключевое слово set.

Можно совмещать различные вариации цикла cmd (командной строки), так, можно попробовать получить список всех заданных файлов, которые есть во вложенных каталогах текущей папки, например:

@echo off set work_dir=d:\work for /d %%B in (%work_dir%\*) do ( for %%C in ("%%B\*.txt") do echo %%C) set work_dir=

В данном примере вначале сценария создается переменная work_dir, который присваивается путь d:\work. Далее следует cmd цикл с ключом /d. Переменная B будет хранить пути ко всем вложенным каталога папки d:\work. При нахождении вложенной папки идет обработка нового цикла cmd, который уже отвечает за поиск текстовых файлов в найденном подкаталоге. Результат как всегда выводится с помощью функции echo. В конце сценария мы удаляем переменную work_dir из переменной среды.

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

Cmd цикл for – обработка полной структуры

Для решения этой задачи, используется следующий синтаксис:

for /R [путь] %%переменная in (набор_файлов) do (оператор)

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

@echo off for /R %SystemRoot% %%B in (*.vbs *.js) do echo %%B

В данном случае происходит поиск файлов с расширением .vbs и .js во всей структуре системного каталога, заданного переменной окружения SystemRoot.

Можно даже извлечь список всех вложенных каталогов для заданной структуры:

@echo off for /R %SystemRoot% /d %%B in (*) do echo %%B

В данном случае, мы использовали оба ключа /R и /D, а символ звездочки указывает на то, что нужно извлечь список абсолютно всех вложенных папок.

scriptcoding.ru

Работа со строками в bat/cmd файлах

Присвоить переменной значение пробел

 

set "charlist= "

-------------------------------------------------------------------------------------------------------

Извлечение подстроки с конца строки

set str=Как утомляет симулировать нормальность echo.%str% set str=%str:~-12% echo.%str%

-------------------------------------------------------------------------------------------------------

Извлечение подстроки с начала строки

set str=Хочешь обнять весь мир - купи глобус echo.%str% set str=%str:~0,6% echo.%str%

-------------------------------------------------------------------------------------------------------

Извлечение подстроки с середины строки

echo.Date : %date% echo.Weekday: %date:~0,3% echo.Month : %date:~4,2% echo.Day : %date:~7,2% echo.Year : %date:~10,4%

-------------------------------------------------------------------------------------------------------

Удаление первого и последнего символа в строке

(часто этот прием используют для удаления окаймляющих кавычек) 

set str=useful echo %str% set str=%str:~1,-1% echo %str%

-------------------------------------------------------------------------------------------------------

Удаление подстроки в строке

В данном примере из строки будет удалена подстрока "кожа " 

set str=У тебя кожа 16-летнего персика echo.%str% set str=%str:кожа =% echo.%str%

-------------------------------------------------------------------------------------------------------

Удаление всех пробелов в строке

Как вариант предыдущего примера 

set str=Чем больше я сплю, тем меньше от меня вреда. echo.%str% set str=%str: =% echo.%str%

-------------------------------------------------------------------------------------------------------

Замена подстроки в строке

set str=Я тебя раскусил, ты оборотень: то как человек, то как баран set str=%str:то=иногда% echo %str%

-------------------------------------------------------------------------------------------------------

Объединение строк

set "str1=Hello" set "str2=World" set "str4=%str1%, %str2%" echo %str4%

Удаление ведущих пробелов

set str= Не ждите чуда, чудите сами echo."%str%" for /f "tokens=* delims= " %%a in ("%str%") do set str=%%a echo."%str%"

-------------------------------------------------------------------------------------------------------

Конвертировать большие буквы в маленькие

:toLower str -- converts uppercase character to lowercase :: -- str [in,out] - valref of string variable to be converted :$created 20060101 :$changed 20080219 :$categories StringManipulation :$source http://www.dostips.com if not defined %~1 EXIT /b for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" "А=а" "Б=б" "В=в" "Г=г" "Д=д" "Е=е" "Ж=ж" "З=з" "И=и" "К=к" "Л=л" "М=м" "Н=н" "О=о" "П=п" "Р=р" "С=с" "Т=т" "У=у" "Ф=ф" "Х=х" "Ц=ц" "Ч=ч" "Ш=ш" "Щ=щ" "Ь=ь" "Ы=ы" "Ъ=ъ" "Э=э" "Ю=ю" "Я=я") do ( call set %~1=%%%~1:%%~a%% ) EXIT /b

Глядя на этот пример не составит трудности написать процедуру обратного преобразования.-------------------------------------------------------------------------------------------------------

ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ

Для выполнения этой операции можно использовать утилиту sbs2.comТрадиция и дошедший комментарий приписывает авторство Herbert Kleebauer. Получить эту программку можно выполнив следующий бат файл: 

rem Create the assembler program, by Herbert Kleebauerecho Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>sbs2.comecho 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6>>sbs2.comecho ?@}IKuNWpe~Fpe?FNHlF?wGMECIQqo{Ox{T?kPv@jeoSeIlRFD@{AyEKj@>>sbs2.comecho iqe~1NeAyR?mHAG~BGRgB{~H?o~TsdgCYqe?HR~upkpBG?~slJBCyA?@xA>>sbs2.comecho LZp{xq`Cs?H[C_vHDyB?Hos@QslFA@wQ~~x}viH}`LYNBGyA?@xAB?sUq`>>sbs2.comecho LRy@PwtCYQEuFK@A~BxPtDss@fFqjVmzD@qBEOEenU?`eHHeBCMs?FExep>>sbs2.comecho LHsPBGyA?@xAunjzA}EKNs@CA?wQpQpKLBHv?s`WJ`LRCYyIWMJaejCksl>>sbs2.comecho H[GyFGhHBwHZjjHeoFasuFUJeHeB?OsQH[xeHCPvqFj@oq@eNc?~}Nu??O>>sbs2.comecho ~oEwoAjBKs?Zp`LBzHQzyEFrAWAG{EFrAqAGYwHTECIQ{coKIsaCsf{Oe~>>sbs2.comecho CK}Ayre~CNFA{rAyEKFACrA{EKGAjbA}eKGSjNMtQFtc{OAyDGFj?{FDGQ>>sbs2.comecho KAjNVk_OCAx@e?f{o?CosI}1EGizhljJ~h2ZeG}JBA~rACBMDGjjDG@g0>>sbs2.com

В результате, в папке, где будет запущен приведенный выше текст, создастся файл sbs2.com.Возможно, вы будете приятно удивлены его размером - 659 БАЙТ!Те, кому вышеприведенные изыски кажутся излишними, могут скачать готовую утилиту здесь.Использование:sbs2.com 0 "Old String" "New String" < infile > outfileОсуществляется замена всех вхождений Old String на New String в файле infile. Результат запишется в файл outfile.

Такую задачу можно решить без использования сторонних программ, только средствами bat !Ниже приведен пример с использованием локальной процедуры txtrepl 

setlocal ENABLEDELAYEDEXPANSION echo off call :txtrepl end finish C:\1\24i.bat C:\1\24i.ba1 pause exit :txtrepl rem param - find, repl, from, to set FINDTXT=%1 set REPLTXT=%2 if EXIST %3 ( set FILEFROM=%3 ) else ( echo error. Not found file %3 pause exit ) set FILEOUT=%4 set COUNT=0 for /F "tokens=*" %%n in (!FILEFROM!) do ( set /A COUNT=!COUNT!+1 set LINE=%%n set TMPR=!LINE:%FINDTXT%=%REPLTXT%! if !COUNT! == 1 ( Echo !TMPR!>!FILEOUT! ) else ( Echo !TMPR!>>!FILEOUT! ) ) exit /b rem end of proc

-------------------------------------------------------------------------------------------------------

Вывод на экран, в файл текста без перевода строки

В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.<nul set /p a=text В данном случае, слово text (а здесь может быть и переменная) будет выведено но экран без перевода строки. Значение переменной a при этом не будет изменено (если это для вас важно).Соответственно, для вывода текста в файл без перевода строки используется конструкция:<nul set /p a=text>b.txt

Использование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант - "вращающейся палки".

-------------------------------------------------------------------------------------------------------

Вычисление длины строковой переменной

В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи: 

:var_count2 set /a %2 =0 set var=%~1 :startvarcount if not defined var exit /b set var=%var:~1% set /a %2+=1 goto startvarcount exit /b

Пример вызова 

set st=abcdefghijklmnopqrstuvwxyz ... call :var_сount2 %st% count2 echo %count2%

Еще один вариант вычисления длины строковой переменной: 

:StringLen :: ----------------------- :: Нахождение длины строки :: ----------------------- :: %1 - текстовая строка :: ----------------------- Set $StringLen=0 Set $StringBuf=%~1 If ""=="%~1" GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:~%$StringLen%%% If ""=="%$StringChr%" GOTO :EOF GoTo :StringLenLoop

Пример вызова 

Call :StringLen "Очень важная срока" Echo %$StringLen%

Еще один способ определения длины строки, как ни странно - достаточно быстрый: 

@Echo Off Set a=qwertyuiop Echo.%a%>"%TEMP%\%~n0.tmp" For %%i In ("%TEMP%\%~n0.tmp") Do Set /A z=%%~zi-2 Echo %z%

Ну и, наконец, решение, поразившее меня своей математической лаконичностью: 

:strLen string len -- returns the length of a string :: -- string [in] - variable name containing :: the string being measured for length :: -- len [out] - variable to be used :: to return the string length :: Many thanks to 'sowgtsoi', but also 'jeb' :: and 'amel27' dostips forum :: users helped making this short and efficient :$created 20081122 :$changed 20101116 :$categories StringOperation :$source http://www.dostips.com ( SETLOCAL ENABLEDELAYEDEXPANSION set "str=A!%~1!"&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avoids trouble in case of empty string set "len=0" for /L %%A in (12,-1,0) do ( set /a "len|=1%<<%%A" for %%B in (!len!) do ^ if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A" ) ) ( ENDLOCAL & REM RETURN VALUES IF "%~2" NEQ "" SET /a %~2=%len% ) EXIT /b

Пример вызова 

set "string=12345678901234 " call :strLen string len echo len=%len%

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

@echo off setlocal ENABLEEXTENSIONS SetLocal EnableDelayedExpansion set "string=123456789012345678901" call :strLen string len echo len=%len% pause exit :strLen string len :: - string [in] - variable name containing the string :: -- len [out] - variable to be used to return the string length SETLOCAL ENABLEDELAYEDEXPANSION set /a nn=10 & rem max length string = 2^^nn. rem If nn=10 - max length=1024 set /a mmin=0 set /a mmax=1"<<"%nn% set "str=Q!%1!" for /L %%A in (%nn%,-1,1) do ( set /a BB = ^(!mmin! + !mmax!^) ">>" 1 call set sim=%%str:~!BB!,1%% if "!sim!" == "" ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %~2=%mmin% EXIT /b %mmin%

-------------------------------------------------------------------------------------------------------

Получение подстроки.

Если смещение начала подстроки и ее длина являются константами - здесь все достаточно просто и аналогичный пример рассматривался выше:

set str=123qwerty456 set d=%str:~3,6% echo %d%

Прошу прощения, если в качестве значения переменной str я опубликовал чей-то пароль )).Если же одна или обе эти величины - переменные, то решение будет не столь простое.Здесь встретиться возможно не совсем обычное применение команды CALL. Немного глубже об этом на странице Полезное в разделе Особенности использования команды CALL. Там же рассмотрен и этот пример.Итак, рассмотрим возможные решения:

set str=123qwerty456 set n1=3 set n2=6 Call Set d=%%str:~%n1%,%n2%%% Echo d=%d%

Очередное решение:

SetLocal EnableDelayedExpansion set str=123qwerty456 set n1=3 set n2=6 Set d2=!str:~%n1%,%n2%! Echo d2=%d2%

Или как вариант предыдущего

setlocal ENABLEEXTENSIONS SetLocal EnableDelayedExpansion set str=zaq12wsx set n1=3 set n2=6 call :SUBSTRING str,%n1%,%n2% echo %SUBD% ........ :SUBSTRING set SUBD=!%1:~%2,%3! exit /b

-------------------------------------------------------------------------------------------------------

Удаление ведущих и замыкающих пробелов.

:ALLTRIM :: ----------------------- :: Krasner B. :: ----------------------- :: %1 - var with txt string :: ----------------------- SetLocal EnableDelayedExpansion set /a firstnoblank=-1 set /a lastnoblank=0 set /a curpos=1 set "str=Q!%1!" :StringLenLoop set SUBD=!str:~%curpos%,1! if "!SUBD!" == "" GoTo :formrez if NOT "!SUBD!" == " " ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set "rez=") else (set rez=!%1:~%n1%,%n2%!) ENDLOCAL & SET %~1=%rez% exit /b 0 )

Пример вызова:

set "strr=" Call :ALLTRIM strr echo result ALLTRIM ^>%strr%^< ::::::::::::: set "strrr= 22 33 " Call :ALLTRIM strrr echo result ALLTRIM ^>%strrr%^<

windows-macos-1.ucoz.ru

W2K - работа с командной строкой (cmd.exe) | windows

1. Сначала общие сведения (взято с Microsoft TechNet). Командная оболочка — это отдельный программный продукт, который обеспечивает прямую связь между пользователем и операционной системой. Текстовый пользовательский интерфейс командной строки предоставляет среду, в которой выполняются приложения и служебные программы с текстовым интерфейсом. В командной оболочке выполняются программы и результат выполнения отображается на экране в виде, сходном с интерпретатором Command.com MS-DOS. Командная оболочка операционной системы W2K использует для перевода введенной команды в формат, понятный системе, интерпретатор команд Cmd.exe, который загружает приложения и распределяет поток данных между приложениями.Имеется возможность использовать командную оболочку для создания и редактирования пакетных файлов (также называемых сценариями, обычно пишутся на Basic, расширение файла vbs), что позволит автоматизировать выполнение обычных задач. Например, сценарии можно использовать для автоматизации управления учетными записями пользователей и ежедневной архивацией в нерабочие часы. Также можно использовать вариант сервера сценариев Windows, запускаемый из командной строки — CScript.exe (или GUI-версия wscript.exe), чтобы выполнить в командной оболочке более сложные сценарии. Если запустить файл сценария (например, двойным щелчком или из командной строки), то по умолчанию используется wscript.exe (это поведение по умолчанию можно изменить, см. подсказку по команде CScript.exe, она выводится, если запустить CScript.exe без параметров). Выполнение операций с помощью пакетных файлов является более эффективным, чем с помощью интерфейса пользователя. Пакетные файлы принимают все команды, доступные из командной строки. Имеется возможность настроить окно командной строки для облегчения просмотра и для увеличения контроля за выполнением программ (системное меню консоли командной строки, Свойства).

1. Запуск командной строки - Пуск\Выполнить...\cmd2. Выход из командной строки - exit.3. Если набрать в командной строке cmd и нажать Enter, то запускается вложенный интерпретатор cmd, т. е. теперь для выхода надо дважды набрать команду exit.4. Использование операторов перенаправления команд http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ru/library/ServerHelp/89fdf70e-7d52-4f45-865d-6a61963a3a7e.mspx?mfr=true Операторы перенаправления команд используются для изменения местоположений потоков ввода и вывода команд, заданных по умолчанию, на какие-либо другие. Местоположение потоков ввода и вывода называется дескриптором.

В следующей таблице представлены доступные дескрипторы.дескриптор   Числовой эквивалент дескриптора Описание STDIN                    0                  Ввод с клавиатурыSTDOUT                   1                  Вывод в окно командной строкиSTDERR                   2                  Ошибка вывода в окно командной строкиUNDEFINED                3-9                 Дескрипторы определяются индивидуально                                             для каждой прикладной программы

Номера от 0 до 9 представляют первые 10 дескрипторов. Для запуска программы и перенаправления любого из 10 дескрипторов используется интерпретатор команд Cmd.exe. Для задания требуемого дескриптора перед оператором перенаправления введите его номер. Если дескриптор не определен, то по умолчанию оператором перенаправления ввода «<» будет ноль (0), а оператором перенаправления вывода «>» будет единица (1). После ввода оператора «<» или «>» необходимо определить, откуда нужно читать или куда нужно записывать данные. Можно задать имя файла или любой из существующих дескрипторов.

Чтобы определить перенаправление для существующих дескрипторов, используйте знак амперсанд (&), за которым идет номер перенаправляемого дескриптора (то есть, &номер_дескриптора). Например, для перенаправления дескриптора 2 (STDERR) в дескриптор 1 (STDOUT) введите:2>&1

В следующей таблице описаны операторы перенаправления потоков ввода и вывода. Оператор перенаправления   Описание >                          Записывает данные на выходе команды вместо окна командной                           строки или дескриптора                            в файл или на устройство, например, на принтер.<                          Читает поток входных данных команды из файла, а не с                           клавиатуры или дескриптора.>>                         Добавляет выходные данные команды в конец файла, не                           удаляя при этом существующей информации из файла.>&                         Считывает данные на выходе одного дескриптора как входные                           данные для другого дескриптора. <&                         Считывает входные данные одного дескриптора как выходные                           данные другого дескриптора. |                          Считывает выходные данные одной команды и записывает их                           на вход другой команды.                            Эта процедура известна под названием «канал». По умолчанию, входные данные команды (дескриптор STDIN) отсылаются с клавиатуры интерпретатору команд Cmd.exe, и Cmd.exe отправляет выходные данные команды (дескриптор STDOUT) в окно командной строки.

Перенаправление входа (<)Чтобы перенаправить вход с клавиатуры в файл или на устройство, используйте оператор «<». Например, для ввода данных в команду sort из файла File.txt введите: sort<file.txt Содержимое файла File.txt появится в командной строке в виде списка в алфавитном порядке.Оператор «<» открывает файл с заданным именем только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с помощью перенаправления <&2 все попытки прочитать дескриптор 0 заканчиваются неудачей, так как дескриптор 2 первоначально открыт с доступом только для чтения.

Примечание• Ноль – это дескриптор по умолчанию для оператора перенаправления ввода «<». Перенаправления вывода (>)Выходные данные практически всех команд высвечиваются в окне командной строки. Даже команды, выводящие данные на диск или принтер, выдают сообщения и запросы в окне командной строки. Чтобы перенаправить вывод из окна командной строки в файл или на устройство, используется оператор «>». Этот оператор используется с большинством команд. Например, для перенаправления вывода команды dir в файл Dirlist.txt введите: dir>dirlist.txt Если файл Dirlist.txt не существует, интерпретатор команд Cmd.exe создаст его. Если файл существует, Cmd.exe заменит информацию в файле на данные, полученные от команды dir.

Для запуска команды netsh routing dump и отправки результатов ее работы в файл Route.cfg введите:netsh routing dump>c:\route.cfg

Оператор «>» открывает указанный файл только для записи. Поэтому с помощью данного оператора файл прочитать нельзя. Например, при запуске программы с перенаправлением >&0 все попытки записать дескриптор 1 заканчиваются неудачей, так как дескриптор 0 первоначально открыт с доступом только для чтения.

Примечание• Единица является дескриптором по умолчанию для оператора перенаправления вывода «>». Дублирование дескрипторовОператор перенаправления «&» дублирует выходные или входные данные с одного заданного дескриптора на другой заданный дескриптор. Например, для отправки выводных данных команды dir в файл File.txt и отправки ошибки вывода в файл File.txt введите:dir>c:\file.txt 2>&1При дублировании дескриптора происходит копирование всех его исходных характеристик. Например, если дескриптор доступен только для записи, то все его дубликаты будут доступны только для записи. Нельзя продублировать дескриптор с доступом только для чтения в дескриптор с доступом только для записи.

Использование оператора «&» для перенаправления ввода и дублированияЧтобы использовать оператор перенаправления ввода (<) с оператором дублирования (&), указанный файл должен существовать. Если входной файл существует, Cmd.exe открывает его только для чтения и отправляет его содержимое в файл, как если бы ввод выполнялся с клавиатуры. При задании дескриптора интерпретатор команд Cmd.exe дублирует его в дескриптор, существующий в системе.

Например, для считывания файла File.txt на вход в дескриптор 0 (STDIN) введите:<file.txt

Для открытия файла File.txt, сортировки его содержимого и последующей отправки в окно командной строки (т. е. в поток STDOUT) введите:sort<file.txt

Для того чтобы найти файл File.txt и перенаправить дескриптор 1 (STDOUT) и дескриптор 2 (STDERR) в Search.txt введите:findfile file.txt>search.txt 2<&1

Для дублирования определенного пользователем дескриптора 3 в качестве входной информации для дескриптора 0 (STDIN) введите:<&3

Использование оператора «&» для перенаправления вывода и дублированияПри перенаправлении вывода в файл и задании существующего имени файла интерпретатор команд Cmd.exe открывает файл с доступом только для записи и переписывает его содержимое. Если дескриптор задан, интерпретатор команд Cmd.exe дублирует файл в существующий дескриптор. Для дублирования определенного пользователем дескриптора 3 в дескриптор 1 введите:>&3Для перенаправления всех выходных данных, включая выходные данные дескриптора 2 (поток STDERR), из команды ipconfig в дескриптор 1 (поток STDOUT) и последующего перенаправления выходных данных в файл Output.log, введите:ipconfig.exe>>output.log 2>&1

Использование оператора «>>» для добавления выводаДля добавления вывода в файл без потери содержащихся в нем данных используется двойной символ «больше» (то есть >>). Например, следующая команда добавляет список каталогов, созданный командой dir, в файл Dirlist.txt: dir>>dirlist.txt

Для добавления выходных данных команды netstat в конец файла Tcpinfo.txt введите:netstat>>tcpinfo.txt

Использование оператора канала (|) - pipeОператор канала «вертикальная линия» (|) забирает выходные данные одной команды (по умолчанию STDOUT) и направляет их на вход другой команды (по умолчанию STDIN). Например, следующая команда сортирует каталог:dir | sort

В данном примере обе команды запускаются одновременно, но команда sort приостанавливает работу до получения выходных данных команды dir. Команда sort использует выходные данные команды dir в качестве своих входных данных, а затем свои выходные данные отправляет в дескриптор 1 (STDOUT).

Комбинирование команд с операторами перенаправленияКомбинируя команды-фильтры с другими командами и именами файлов, можно создавать команды на заказ. Например, для сохранения имен файлов, содержащих строку «LOG», используется следующая команда: dir /b | find "log" loglist.txtВыход команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле Loglist.txt в виде списка (например, NetshConfig.log, Logdat.svd и Mylog.bat).

При использовании более одного фильтра в одной команде их необходимо отделять с помощью канала (|). Например, следующая команда ищет в каждом каталоге диска C файлы, в названии которых присутствует строка «Log», и выводит их постранично на экран:dir c:\ /s /b | find "log" | moreНаличие канала (|) указывает Cmd.exe, что выход команды dir нужно отправить команде-фильтру find. Команда find выбирает только те имена файлов, в которых содержится строка «LOG». Команда more выводит на экран имена файлов, полученные командой find с паузой после заполнения каждого экрана.

5. Для командной строки возможно использование фильтров, что позволяет управлять выводом информации. Всего есть 3 команды-фильтра:More     Отображает содержимое файла или вывода команды в одном окне командной строки за раз.Find     Поиск указанных символов в файлах и выходе команды.Sort     Сортировка файлов и выхода команды по алфавиту. 6. Использование нескольких команд и символов условной обработкиМожно выполнять несколько команд из одной командной строки или сценария с помощью символов условной обработки. При использовании нескольких команд, содержащих символы условной обработки, выполнение команд, стоящих справа от символа условной обработки, будет проводиться в зависимости от результатов выполнения команды, стоящей слева от символа. Например, требуется, чтобы команда выполнялась, только если предыдущая команда не была выполнена успешно. Или требуется, чтобы команда выполнялась, только если предыдущая команда была выполнена успешно.

Для передачи нескольких команд можно использовать специальные символы, перечисленные в следующей таблице.Символ     Синтаксис                      Определение & [...]    команда1 &команда2             Используется для разделения нескольких                                           команд в одной командной строке.                                            В Cmd.exe выполняется первая команда,                                           затем вторая команда.&& [...]   команда1 &&команда2            Запускает команду, стоящую за символом &&,                                           только если команда, стоящая перед этим                                           символом была выполнена успешно.                                            В Cmd.exe выполняется первая команда.                                           Вторая команда выполняется, только если                                            первая была выполнена успешно. || [...]   команда1 || команда2           Запускает команду, стоящую за символом ||,                                           только если команда, стоящая перед                                           символом || не была выполнена.                                            В Cmd.exe выполняется первая команда.                                           Вторая команда выполняется, только если                                           первая не была выполнена (полученный код                                           ошибки превышает ноль).( ) [...]  (команда1 & команда2)          Используется для группировки или вложения                                           команд.; или ,    команда1 параметр1;параметр2   Используется для разделения параметров                                           команды. Примечания• Амперсанд (&), вертикальная черта (|) и скобки ( ) являются специальными символами, которым должен предшествовать управляющий символ (^) или кавычки, если эти символы передаются в качестве аргументов.• Если команда завершает операцию успешно, возвращается нулевой (0) код ошибки или не возвращается никакого кода. Дополнительные сведения о кодах завершения см. в разделе Использование пакетов Windows Deployment Kit и Windows Resource Kit. 7. Использование оператора канала (|) в скрипте vbs- создайте файл test.vbs с таким содержимым:WScript.Echo "calc"- наберите в командной строке cscript test.vbs //Nologo | cmd  после нажатия Enter запустится калькулятор

microsin.net

Командные файлы Windows часть 1

04:04 pm - Командные файлы Windows часть 1

Общие сведения о командном процессоре Windows.Использование переменных в командных файлах.Передача параметров командному файлу.Переходы и метки.Примеры командных файлов:    - Своя команда для создания новых файлов.    - Присвоение съемному диску одной и той же буквы.    - Создание архива, имя которого содержит дату и время.    - Выполнение только в заданный интервал времени.    - Пример создания архива каталога пользователя.    - Изменение даты и времени для файлов и папок.    - Выполнение команд по расписанию.    - Запуск и остановка служб Windows в командной строке.    - Выдача на экран значения ERRORLEVEL.    - Диалог с пользователем.    - Задержки в командных файлах.    - Определение доступности IP-адреса.    - Определение текущей версии Windows.    - Поиск в локальной сети компьютеров с запущенным приложением.    - Поиск компьютеров с запущенным приложением по списку на основе сетевого окружения.    - Выключение компьютеров по списку, созданному на основе сетевого окружения.    - Поиск в локальной сети включенных компьютеров.    - Работа с дисками, файлами и каталогами.    - Работа с графическими приложениями из командной строки.    - Перекодировка текстовых файлов .Часто встречающиеся ошибки при написании командных файлов.Использование .bat и .cmd в сценариях регистрации пользователей.

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

   Командные файлы (скрипты, сценарии, батники) - это обычные текстовые файлы с расширением .bat или .cmd, строки которых представляют собой специальные команды командного процессора (интерпретатора команд ) и/или имена исполняемых файлов. Командный процессор – это специальная программа, являющаяся обязательным элементом почти любой операционной системы, главным назначением которого, является предоставление пользователю средства для выполнения определенных программ без их компиляции и создания исполняемых файлов. Для операционных систем DOS и Windows9X в качестве интерпретатора команд использовался командный процессор command.com, для всех остальных ОС семейства Windows ( NT/2k/XP/Vista/7/8 и старше) - cmd.exe. Несмотря на непрерывное совершенствование средств создания и выполнения сценариев с использованием объектно-ориентированных языков, обычная командная строка и простые командные файлы, по-прежнему остаются основным инструментом для выполнения рутинных действий, диагностики сетевых проблем, автоматизации процессов резервного копирования и т.п. При всех недостатках реализации командного процессора в Windows, достойной альтернативы ему нет, и очевидно в ближайшем будущем, не будет.

    Строки командных файлов могут содержать специфические команды самого процессора команд (FOR, ECHO, REM и т.п.) или имена исполняемых модулей (net.exe, regedit.exe, sc.exe) Командный процессор может быть запущен в интерактивном режиме через Пуск - Выполнить - CMD.EXE. В данном режиме, вы увидите окно консоли с приглашением к вводу команд. Возможный список большинства консольных команд можно получить введя:

HELP

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

HELP Имя команды

Если вы работаете в русифицированной версии Windows, то учтите, что в среде командного процессора символы национального алфавита используются в DOS-кодировке. Для переключения между кодовыми страницами Windows и DOS используется команда

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

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

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

Для просмотра и редактирования командных файлов, содержащих символы русского алфавита нужно использовать редактор с поддержкой DOS-кодировки. Если вы используете стандартное приложение "Блокнот" (notepad.exe), то для правильного отображения символов русского алфавита нужно выбрать шрифт Terminal, с помощью меню Правка - Шрифт...

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

COLOR

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

COLOR F0 - черные символы на белом фоне.

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

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

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

> - перенаправление вывода

< - перенаправление ввода

Для вывода справки не на экран а, например, в файл с именем 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 можно получить, введя в качестве аргумента ключ /?

cmd.exe /?

Кроме символов перенаправления ввода-вывода в командной строке могут использоваться символы объединения команд - && и ||

cmd.exe /C "HELP IF > nul" && Echo HELP Executed || Echo HELP Not Executed - выполнить команду HELP IF и при успешном результате выполнить команду Echo HELP Executed, а при неуспешном - Echo HELP Not Executed. Команды, объединяемые для выполнения с помощью конструкции && , не нужно заключать в двойные кавычки. Выполнение строки

cmd.exe /C "HELP IF > nul" && Echo HELP Executed || Echo HELP Not Executed

завершится сообщением HELP Executed, а выполнение

cmd.exe /C "HELP uIF > nul" && Echo HELP Executed || Echo HELP Not Executed

где неверно задан аргумент команды HELP ( uIF ), завершится сообщением HELP Not Executed

Файлы с расширением .bat или .cmd в среде Windows стандартно открываются командным процессором аналогично примеру, где список команд считывается не с устройства ввода, а из текстового файла.

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

   

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

SET переменная=строка

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

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

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

SET myname=Vasya

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

Значение, присвоенное какой-либо переменной, доступно для обработки в командных файлах, при использовании ее имени, заключенного в знаки процента - % . Например команда выдачи текста на дисплей ECHO в виде:

ECHO date - выведет на экран слово "date", а команда

ECHO %date% выведет на экран значение переменной date - текущую дату в формате операционной системы.

С помощью команды 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, то запуск приложения myedit.exe завершится ошибкой. Однако, если есть необходимость его запуска без указания полного пути и при любом значении текущего каталога, можно модифицировать значение переменной PATH

Команда

SET PATH=C:\NewProgs;%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% - Принимает значение строки, которая вызвала командный процессор.

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

ECHO %переменная%

ECHO %CD% - отобразить имя текущего каталога

ECHO %TIME% - отобразить текущее время

ECHO %ERRORLEVEL% - отобразить результат выполнения предыдущей команды.

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

В состав дополнительных средств Windows 2000/XP, и в комплект дистрибутива Windows 7 входит специальная утилита для формирования пользовательских и системных переменных окружения SetX, позволяющая записывать имена и значения переменных в реестр . Ссылка "Список команд CMD Windows" в конце статьи.

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

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

BAT-файл параметр1 параметр2 ... параметрN

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

Создаем, например, командный файл params.bat следующего содержания:

echo offecho Это командный файл %0

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

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

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

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

params.bat FIRST second "two words"

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

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

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

if "%1" EQU "" goto error

....

...

:error

Echo Должен быть задан хотя бы один входной параметр

exit

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

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

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

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

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

ECHO OFF

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

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

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

Если к имени команды первым символом добавляется @, то независимо от режима ECHO (ON или OFF), вывод обрабатываемой строки не выполняется. Попробуйте в данном примере "ECHO OFF" заменить на "@ECHO OFF" - результат говорит сам за себя. Строка, которая выключает режим вывода, не будет выдаваться на экран. Вывод эха на экран устанавливается по команде ECHO ON и, обычно, используется в целях диагностики.

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

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

REM но строки, начинающиеся символом @ выводиться не будутECHO ON

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

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

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

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

   В командных файлах можно использовать команды условного перехода, меняющие логику их работы в зависимости от выполнения определенных условий. Для иллюстрации приемов использования условных переходов создадим командный файл, целью которого будет присвоение заранее определенной буквы для съемных носителей, в качестве которых будут использоваться флэш-диски. Условия таковы - есть 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:

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

@ECHO OFF

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 перед подключением. Попробуйте изменить командный файл setletter.bat с использованием команды перехода GOTO, осуществляющей передачу управления строке пакетного файла на указанную метку.

GOTO метка

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

@ECHO OFF

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

IF NOT EXIST X:\ GOTO SETX

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

GOTO TESTY

:SETX

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

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

:TESTY

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

IF EXIST Y:\ GOTO EXIT

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

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

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

:EXIT

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

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

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

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

@ECHO OFF

ECHO Вызов 1.bat

CALL 1.bat

ECHO Возврат.

В этом же каталоге, создайте второй файл под именем 1.bat, содержащий команду

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

@ECHO OFF

pause

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

Вызов 1.bat

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

Возврат.

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

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

@ECHO OFF

ECHO Вызов 1.bat

CALL 1.bat

ECHO Получено из файла %MYFILE% значение MYNUMBER=%MYNUMBER%.

а в файле 1.bat на следующее

@ECHO OFF

SET MYFILE="Very good 1.bat"

SET MYNUMBER=99

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

CALL test.bat

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

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

call :proc1

....

:proc1

....

exit

....

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

   Использование утилит командной строки и командных файлов нередко позволяют решить многие проблемы связанные с повседневной эксплуатацией компьютерной техники. Большинство системных администраторов и грамотных пользователей продолжают ими пользоваться, несмотря на то, что в Windows проявилось новое, более мощное и современное средство управления системой - WMI (Windows Management Instrumentation). Очевидно, не в последнюю очередь, это обусловлено простотой реализации и, тем не менее, - достаточной эффективностью использования командных файлов. Ниже приведены простые примеры с комментариями, которые демонстрируют некоторые возможности и способы применения .cmd и .bat

uzverss.livejournal.com

Работа с файлами и каталогами в OS, Far, cmd. Запуск программ. Ассоциации. Командные файлы.

Стр 1 из 6Следующая ⇒

Лабораторные занятия

1. Определение аппаратной конфигурации компьютера (BIOS, sysinfo, dxdiag). Работа в командном интерпретаторе (консоли) Windows. Электронный учебник DOS "Магистр". Команды dir, md, cd, rd, type, copy, del, ren, time, date, path, set, ver, cls, more, echo, prompt.

Символы ":","\", "/", "..", ".", "*" , "?", "|", "<", ">",">>", "2>", "2>&1".

Задание 1.

А) Читать учебник Магистр (magi.exe), весь, кроме редактора. Magi находится и запускается в VirtualXP Mode – пользователь: XPMUser, пароль: bilder.

Б) Выполнить письменно на листочке:

1). Определить аппаратную конфигурации компьютера всеми Вам доступными способами (BIOS, информация о системе, dxdiag).

2). Описать назначение приведенных команд с примерами. Описать назначение приведенных символов при использовании их в командной строке с примерами (читать Магистр, Help, Интернет). Написать команды создания нового (текстового) файла с произвольным текстом с использованием команд: ECHO и COPY.

Например,

CD \ -смена текущего каталога на корневой;

CD \tmp – смена текущего каталога на корневой и в нем на tmp

CD C:\tmp -смена текущего каталога на диске C: на \tmp

CD /D C:\tmp -смена текущего диска на диск C и каталога на С на \tmp

С: - смена текущего диска

DIR C: -…? (заметьте, что каталог в команде не указан)

CD K: - … ?

Вопрос по листочку (если не отражено) - написать, что это за конструкции

A > B ; A<C ; A>B<C ; A|C ? Где здесь команды (программы), а где текстовые файлы?

Вопрос: \a.exe; ..\a.exe; .\a.exe; a.exe; h:a.exe – где ищется для выполнения файл a.exe?

Что это означает в командной строке A 2>B или это A 2>&1или это A >B 2>&1 ?

Работа с файлами и каталогами в OS, Far, cmd. Запуск программ. Ассоциации. Командные файлы.

Задание 2.

Запуск программ. (Дописываем листочки, исправляем замечания в них)

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

А) Запуск dxdiag.

Dxdiag.exe (запускается без указания пути)

Вопрос: Какой именно файл при этом загружается (где ищется)?

Б) Запуск архиватора 7z.

(запускается только с указанием полного пути, по методу А) – не запускается, почему?)

В) Запуск учебника Магистр (универсальный метод).

(запускается в две или три строки:

i) смена текущего диска – С:

ii) смена текущего каталога - CD \WORK\MAGI

iii) magi.exe

или

i) смена текущих диска и каталога CD /D C:\WORK\MAGI

ii) magi.exe

Методом А) не запускается, методом Б) не правильно работает, почему?.

 

Наводящие вопросы: Для чего нужна переменная среды PATH?

Вы это в листочке написали? Покажите его еще раз.

Как исправить переменную среды PATH, чтобы 7z запускался как dxdiag?

 

3. Антивирусные программы: DrWeb, Cureit, AVZ. Программы архивации файлов: zip, rar.

Задание 3.

Создать ком. файлы.

А) Запуск имеющейся на компьютере антивирусной программы с проверкой флэш диска.

Б) Запуск архиватора 7z (три операции, три ком. файла):

- архивация каталога с подкаталогами в архив zip:

“C:\Program files\7-zip\7z.exe” a -r -tzip C:\WORK\7 “C:\Program files\7-zip\”

- тестирование архива

“C:\Program files\7-zip\7z.exe” t C:\WORK\7.zip

- разархивирование архива в каталог С:\WORK.

“C:\Program files\7-zip\7z.exe” x C:\WORK\7.zip -oC:\work

4. Работа с дисками и дискетами: diskpart, format, chkdsk, defrag. Работа в локальной сети.

Задание 4.

Прочитать в Help (Помощи) о Форматировании(format), Проверке на ошибки(chkdsk), Дефрагментации(defrag).

Ответить на вопросы:

Что это за операции, когда и зачем надо их выполнять?

Какие ошибки дисков Вы знаете? (Потерянные кластеры, плохие(Bad) секторы)

Что такое фрагментация диска? Когда она возникает?

 

mykonspekts.ru

Работа с датой, временем. Примеры bat / cmd файлов.

Хотел бы обратить ваше внимание на то, что если в номере месяца, дня или данных времени присутствует ведущий ноль - он должен быть удален перед выполнением арифметических действий. Это делается потому, что в bat файлах числа (не строки!), начинающиеся с 0, считаются восьмеричными. Следовательно такие числа, как 08 и 09 не имеют смысла, так как цифр 8 и 9 нет в восьмеричной системе счисления.Не забывайте об этом при арифметической обработке данных!Вместо проверки и удаления ведущих нулей, учитывая, что эти числа меньше ста, можно использовать следующий прием:

set /a m=100%dd%%%100

Итак, рассмотрим некоторые примеры решения задач, связанных с обработкой даты и/или времени.

Определения названия дня недели по номеру дня в неделе.

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :Day2Name %d% day :: By: Ritchie Lawrence, 2002-10-04. Version 1.0 :: Func: Returns the day of week from the day number, 1=Monday, 7=Sunday. :: For NT4/2000/XP/2003. :: Args: %1 day number to convert to name of day of week, 1 to 7 (by val) :: %2 var to receive name of day of week (by ref) ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: for /f "tokens=%1" %%a : in ('echo Понедельник Вторник Среда Четверг Пятница Суббота Воскресение') ^ do set %2=%%a exit /b 0

Пример вызова

call :Day2Name 2 day echo Второй день недели - это %day%

Еще один вариант решения этой задачи:

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :Day2Name %d% day set map=1-Понедельник;2-Вторник;3-Среда;4-Четверг;^ 5-Пятница;6-Суббота;7-Воскресение; CALL SET v=%%map:*%1-=%% SET v=%v:;=&rem.% set %2=%v% exit /b 0

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

Удаление файлов с истекшим временем хранения

В следующем примере из заданной папки (OTKUDA) по требуемой маске (MASK) удаляются файлы, которые были созданы более определенного количества дней назад (N). 

@echo off setlocal enabledelayedexpansion rem age files in days set N=14 set MASK=*.bak set OTKUDA=D:\00tt\00 call :raschet %date% days_to_today pushd %OTKUDA% for /f "tokens=*" %%a in ('dir /b /a:-d %MASK%') do ( set filedate=%%~ta call :raschet !filedate:~0,10! days_to_date_of_file set /a raznitsa=%days_to_today%-!days_to_date_of_file! if !raznitsa! gtr %N% del /q "%%a" ) popd exit :raschet for /f "delims=. tokens=1-3" %%a in ('echo %~1') do ( set /a years=%%c*365+%%c/4 set /a prev_year=%%c-1 set /a result_year=%%c/4 set /a result_prev_year=!prev_year!/4 set /a vis=!result_year!-!result_prev_year! if !vis!==1 ( if %%b==01 set /a years=!years!-1 if %%b==02 set /a years=!years!-1 ) if %%b==01 set months=0 if %%b==02 set months=31 if %%b==03 set months=59 if %%b==04 set months=90 if %%b==05 set months=120 if %%b==06 set months=151 if %%b==07 set months=181 if %%b==08 set months=212 if %%b==09 set months=243 if %%b==10 set months=273 if %%b==11 set months=304 if %%b==12 set months=334 set days=%%a set firstsym=!days:~0,1! if !firstsym!==0 set days=!days:~1,1! set /a %~2=!years!+!months!+!days! )

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

Посмотрел внимательно предыдущий пример и переделал его.Теперь он не занимает и 40 строк. И, безусловно, его еще можно сократить! Если поставить именно такую цель. В данном же случае цель примеров - показать возможности и различные приемы написания bat файлов. По той же причине предыдущий пример пока не удалил, так как, на мой взгляд, он легче для понимания. 

@echo off setlocal enabledelayedexpansion set N=14 set MASK=*.php set OTKUDA=D:\00tt\00 call :raschet %date% days_to_today pushd %OTKUDA% for /f "tokens=*" %%a in ('dir /b /a:-d %MASK%') do ( set filedate=%%~ta call :raschet !filedate:~0,10! days_to_date_of_file set /a raznitsa=%days_to_today%-!days_to_date_of_file! if !raznitsa! gtr %N% del /q "%%a" ) popd exit :raschet for /f "delims=. tokens=1-3" %%a in ('echo %~1') do ( set /a years=%%c*365+%%c/4 set /a prev_year=%%c-1 set /a result_year=%%c/4 set /a result_prev_year=!prev_year!/4 set /a vis=!result_year!-!result_prev_year! set numm=%%b if "!numm:~0,1!" == "0" set numm=!numm:~1,1! if !vis!==1 ( if !numm! LSS 3 set /a years=!years!-1 ) call :Day2Num !numm! months set days=%%a if "!days:~0,1!" == "0" set days=!days:~1,1! set /a %~2=!years!+!months!+!days! ) exit /b 0 :Day2Num %d% day for /f "tokens=%1" %%I in ^ ('echo 0 31 59 90 120 151 181 212 243 273 304 334') ^ do set /a %2=%%I exit /b 0

В этом примере подпрограмма Day2Num в некоторой степени имитирует работу с массивом констант.))

Если же рассматривать практическую сторону задачи - удаление файлов старше определенного количества дней - то нельзя не упомянуть еще несколько способов решения задачи.Утилита robocopy позволяет (среди прочего) перемещать файлы по условию, например, старше определенного количества дней. Непосредственно удалять эта утилита не позволяет, поэтому файлы по условию перемещаются во временную директорию, а уже оттуда отправляются на Небесный Независающий Сервер (командой del). 

... set robotemp=%TEMP%\robotemp MD %robotemp% ROBOCOPY "C:\source_folder" %robotemp% /move /minage:7 del %robotemp% /q ...

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

В том же пакете Resource Kit, а начиная с Windows VISTA - как стандартный компонент, есть и более приспособленная для этого утилита - forfiles.Надо заметить, что параметры этой программы... как бы так сказать... несколько нестандартные. Но ряд преимуществ, которые она дает, стоят того, чтобы в них разобраться. Для решения нашей задачи используется следующий вызов:

forfiles /p "C:\source_folder" /s /m *.* /c "cmd /c Del @path /q" /d -7

Подробнее о параметрах forfiles смотрите в разделе.

windows-macos-1.ucoz.ru

Урок 9 по CMD - цикл for, обработка текстовых строк

В этой статье мы рассмотри как используется цикл командной строки for для обработки текстовых строк и файлов. Тут будет фигурировать ключ /f, который меняет логику работы цикла командной строи (cmd) for и позволяет производить разбор любого текста по полочкам, так сказать.

Давайте начнем...

Цикл cmd for – обработка текста

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

for /f ["параметры"] %%переменная in (источник) do (оператор)

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

Значение “параметры” может быть одним или комбинацией таких параметров:

eol – позволяет задать признак концевого комментария (end-of-line comment character). Весь текст, что будет находиться после него, будет приниматься за комментарий, например,“eol=#” – тут символ # является признаком концевого комментария. Собственно, комментарий не будет обрабатываться.

skip – позволяет в цикле cmd for задать количество строк, которые нужно пропустить, счет идет с начала файла, например, “skip=10” – в данном случае будут пропущены строки от первой до десятой.

delims – параметр позволяет задать дополнительные разделители строки на подстроки. Так, стандартными разделителями является пробел и символ табуляции. Например, “delims=,.:” – тут мы определили, что запятые, точки и двоеточия являют­ся разделителями.

tokens  - данный параметр командной стоки цикла for cmd позволяет указать, какие номера полей строки, полученных из заданного текста, нужно передать для обработки в цикл. Полученные поля будут храниться в отдельной переменной. Фактически, если принимать каждое слово строки как отдельный элемент, то параметр tokens позволяет указать, какие именно слова по счету нужно обработать. Как упоминалось выше, стандартным разделителем является пробел и табуляция.

Для дополнительной переменной, как и для переменной инициализации, в качестве имени указывается латинская буква, большая или маленькая. Значения можно указывать как через запятые, например, “tokens=1,4, 9” – первый, четвертый и девятый элемент, так и через диапазон, например, “tokens=4-11” – с четвертого по одиннадцатый. Можно комбинировать: “tokens=4-10,15,20” – с четвертого по десятый, а также, пятнадцатый и двадцатый элемент. Если мы укажем в качестве последнего значения звездочку, то создастся еще одна переменная, которая будет хранить в себе все остальные элементы (строки) текста.

usebackq – данный параметр является довольно интересным и полезным, так как позволяет выполнять команды, передав их как параметр. Включив этот параметр, двойные кавычки будут применяться для имен файлов и пути к ним, обратные кавычки (`), они находятся на той же кнопке, что и символ (~) – для исполняемых команд, а одинарные кавычки – для литеральных строк.

Хорошо, теперь можно рассмотреть цикл cmd for и работу с ним на практике.

Допустим, у нас есть файл test.txt, в котором прописаны такие строки:

100 200 300#это комментарий400 500 60010; 20; 30;

Попробуем выполнить такой код:

@echo off for /F "eol=#" %%A in (d:\work\test.txt) do echo %%A

На выходе функция echo выведет:

10040010;

Как видим, строка с комментарием не вывелась, но и остальные строки вывелись не полностью, что бы это исправить, напишем так:

@echo off for /F "eol=# tokens=*" %%A in (d:\work\test.txt) do echo %%A

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

Теперь запишем в текстовый файл такой текст:

Ukraina-Kijev-grivna-saloRossija-Moskva-rubl-blinyBelorussija-Minsk-zajec-kartoskaChechija-Praga-krona-pivo

@echo off for /f "tokens=1-4 delims=-" %%A in (d:\work\test.txt) do ( (@echo Strana:%%A Stolica:%%B Valuta:%%C Produkt:%%D) & Echo.)

Тут мы указали, что разделителем является тире, и указали, что надо обработать первые четыре поля строки, каждое из которых хранится в отдельной переменной. Как видим, в цикле for cmd идет обработка каждой строки из текста, на выходе мы получим:

Strana:Ukraina Stolica:Kijev Valuta:grivna Produkt:salo

Strana:Rossija Stolica:Moskva Valuta:rubl Produkt:bliny

Strana:Belorussija Stolica:Minsk Valuta:zajec Produkt:kartoska

Strana:Chechija Stolica:Praga Valuta:krona Produkt:pivo

Я специально вставил между строк пустую (echo.) что бы было лучше видеть.

Осталось рассмотреть пример с параметром usebackq:

@echo off set get_dir=d:\work\hello.txt for /f "usebackq" %%A in (`echo Hello, Wold ^>^> "%get_dir%"`) do echo OK type %get_dir% set get_dir=

В данном случаем мы выполняем команду: записываем фразу “Hello, Wold” в текстовый файл, путь к которому содержится в переменной get_dir. В конце выводим содержимое файла и удаляем переменную.

Знаю, знаю, мало примеров, ничего, я исправлюсь…

scriptcoding.ru