Следуйте за нами на нашей фан-странице, чтобы получать уведомления каждый раз, когда появляются новые статьи.
Facebook
Что такое батники и с чем их едят
Пакетный файл или в простонародье батник – это файл, который запускает командную сроку или сокращенно cmd, которая построчно интерпретирует команды, записанные в нем. Подробнее смотрите на https://ru.wikipedia.org/wiki/Пакетный_файл.
This book describes and shows how to use the Microsoft-supplied command interpreter cmd.exe and the associated commands, and how to write Windows batch scripts for the interpreter. cmd.exe is the default interpreter on all Windows NT-based operating systems, including Windows XP, Windows 7 and Windows 10.
1- Что такое переменная?
Переменная является базовым понятием в компьютерной науке, это значение, которое может меняться. Как и другие языки, Batch так же имеет понятие переменной.
В принципе Batch имеет 2 вида переменных:
- Переменные объявлены в файле через команду set.
- Переменная аргумента (Argument variable), передается (pass) снаружи когда файл вызывается для выполнения.
Первая программа и основные команды
Чтобы сделать батник, нужно сначала создать текстовый файл с именем test и изменить расширение c .txt на .bat. О том, как можно это сделать, читайте здесь: https://remontka.pro/file-extensions. У вас должен появиться файл с такой иконкой:

Нажимаем на него ПРАВОЙ кнопкой мыши. Должно появиться диалоговое окно. Нажмем “Открыть”. Должен открыться блокнот, пишем:
@echo off
echo Hello world!
pause
Some notes and some tricks.
The ‘official’ way to assign result to a variable is with FOR /F
though in the other answers is shown how a temporary file can be used also.
For command processing FOR
command has two forms depending if the usebackq
option is used. In the all examples below the whole output is used without splitting it.
FOR /f "tokens=* delims=" %%A in ('whoami') do @set "I-Am=%%A"
FOR /f "usebackq tokens=* delims=" %%A in (`whoami`) do @set "I-Am=%%A"
and if used directly in the console:
FOR /f "tokens=* delims=" %A in ('whoami') do set "I-Am=%A"
FOR /f "usebackq tokens=* delims=" %A in (`whoami`) do set "I-Am=%A"
%%A
is a temporary variable available only on the FOR
command context and is called token.The two forms can be useful in case when you are dealing with arguments containing specific quotes. It is especially useful with REPL interfaces of other languages or WMIC.
Though in both cases the expression can be put in double quotes and it still be processed.
Here’s an example with python (it is possible to transition the expression in the brackets on a separate line which is used for easier reading):
@echo off
for /f "tokens=* delims=" %%a in (
'"python -c ""print("""Message from python""")"""'
) do (
echo processed message from python: "%%a"
)
There is no simple way for complex contents like "&"^&
, as it’s not possible to access %1 without producing an error.
set var=%1
set "var=%1"
set var=%~1
set "var=%~1"
The lines expand to
set var="&"&
set "var="&"&"
set var="&"&
set "var="&"&"
And each line fails, as one of the &
is outside of the quotes.
It can be solved with reading from a temporary file a remarked version of the parameter.
@echo off
SETLOCAL DisableDelayedExpansion
SETLOCAL
for %%a in (1) do (
set "prompt="
echo on
for %%b in (1) do rem * #%1#
@echo off
) > param.txt
ENDLOCAL
for /F "delims=" %%L in (param.txt) do (
set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'
The extra characters * #
are used to be safe against contents like /?
(would show the help for REM
).
Or a caret ^ at the line end could work as a multiline character, even in after a rem
.
Then reading the rem parameter output from the file, but carefully.
The FOR /F should work with delayed expansion off, else contents with “!” would be destroyed.
After removing the extra characters in param1
, you got it.
And to use param1
in a safe way, enable the delayed expansion.
IntroductionEdit
This book addresses 32-bit Windows commands applicable to modern versions of Windows based on the Windows NT environment. It does not address commands that are specific to DOS environments and to DOS-based operating systems, such as Windows 95, Windows 98, and Windows Me, whose Microsoft-supplied command interpreters are in fact DOS programs, not Win32 programs.
You can find out which version of Windows you are running using the VER command.
The subject of this book is also known as “batch programming”, even though “batch” refers not only to batch files for MS DOS and Windows command interpreter. Other subject terms include “batch file programming”, “batch file scripting”, “Windows batch command”, “Windows batch file”, “Windows command line”, “Windows command prompt”, and “Windows shell scripting”.
For Windows scripting, cmd.exe is a legacy technology; a modern equivalent is PowerShell, which is based on .NET and whose streams for pipelines are objects, not character (byte) streams. PowerShell capabilities vastly outstrip those of cmd.exe; PowerShell has the capabilities of a full programming language, including typed content of variables, floating-point arithmetic, big integers, GUI programming via .NET classes, etc. Nonetheless, cmd.exe is still useful for simple scripting and command-line interaction tasks, often offering shorter syntax and quicker startup time, and working with the character stream pipelining familiar from other operating systems. cmd.exe can be enhanced by commands known from other operating systems; see #Unix commands. Another alternative for scripting Windows is the popular Python with its pywin32 and wmi libraries; however, that requires installation.
Introduction
Basic integer math functions using SET /A were first introduced in Windows NT 4.
With SET /A we can:
By the way, in all the examples above, the value of environment variable Result
will be 16.
Missing functionality like exponentiation and (square) root can be emulated (“core” code marked red):
@ECHO OFF :: Exponentiation (positive integers only) :: Usage: Exp num pow :: E.g. EXP 2 10 = 1024 IF "%~2"=="" EXIT /B 1 IF NOT "%~3"=="" EXIT /B 1 SETLOCAL ENABLEDELAYEDEXPANSION SET /A Num = %~1 SET /A Pow = %~2 IF NOT %~1 EQU %Num% (ENDLOCAL & EXIT /B 1) IF NOT %~2 EQU %Pow% (ENDLOCAL & EXIT /B 1) IF %Num% LSS 0 (ENDLOCAL & EXIT /B 1) IF %Pow% LSS 0 (ENDLOCAL & EXIT /B 1) ENDLOCAL
@ECHO OFF :: Square root (integer results only) :: Usage: Sqrt num :: E.g. SQRT 64 = 8 IF "%~1"=="" EXIT /B 1 IF NOT "%~2"=="" EXIT /B 1 SETLOCAL ENABLEDELAYEDEXPANSION SET /A Num = %~1 IF %Num% NEQ %~1 (ENDLOCAL & EXIT /B 1) IF %Num% LSS 0 (ENDLOCAL & EXIT /B 1) SET /A "UBound = ( %Num% + 1 ) / 2" FOR /L %%A IN (0,1,%UBound%) DO ( IF !Error! EQU 0 ( IF !Found! EQU 0 ( FOR /F %%B IN ('SET /A %%A * %%A') DO ( IF %~1 LSS %%B ( ) ELSE ( ) ) ) ) ) ) ENDLOCAL & EXIT /B %Error%
The square root functionality is severely limited, it can only return square roots of squared integers.
Объявление собственных переменных является неотъемлемой часть практически любого языка программирования, так в языке vbscript они объявляются с помощью ключевого слова dim, а в jscript – используется ключевое слово var.
Переменные командной строки Windows представляют немного другой характер, тут нельзя объявить группу переменных cmd, или же сразу присвоить значения нескольким переменным в командной строке. Давайте посмотрим на следующие строчки кода:
=D:\Work ==
В данном примере, с помощью ключевого слова cmd set мы поэтапно объявили три переменные (Var1, Var2 и Var3), как и в языке vbscript, в cmd регистр символов не играет роли, поэтому, данные строчки выведут фразу «Привет Мир!!!»
Var3 VAR3 vAr3
Var3VAR3vAr3
Стоит учитывать один момент, запись
это не одно и тоже, то есть, в первом случае мы создаем cmd переменную «var1», а во втором – «var1 «. С присвоением значений аналогичная ситуация, так что обращайте внимание на пробел!!!
Если вы запустите на выполнение команду cmd set, которая выводит список всех переменных и их значений в текущем сеансе, то увидите, что там будут присутствовать и только что созданные cmd переменные и переменные среды. Мы сможем обращаться к ним на протяжение всего сеанса работы.
Что бы очистить переменные в командной строке Windows от их содержимого, нужно просто присвоить пустое значение:
Мы просто после имени прописали знак равенства и все. Стоит помнить, что если в таких языках программирования как vbscript и jscript присвоение пустого значения переменной не влияет на ее существование, то в командной строке происходит полное ее удаление, то есть, команда:
просто выведет строчку %Var3%, а команда
Выведет сообщение «переменная среды var3 не определена»
= ^ = = ^^
В данном примере мы экранировали символы & и ^, тем самым присвоив фразы:
«100 & 3 = 5»
«100 ^3»
100
«3» не является внутренней или внешней командой, исполняемой программой или командным файлом.
= ^^^ = = ^^^^
Теперь при выполнении кода:
все пройдет успешно.
Как и в сценариях сервера Windows Script Host, переменные в командной строке Windows могут содержать заданную область видимости.
– блок кода, за пределами которого нельзя получить доступ к переменным, объявленным в нем. Довольно ясно значение области видимости проявляется при роботе с функциями, по этому вопросу можете прочить статью «Урок 3 по JScript: Объявление пользовательских функций«.
Понятно, что переменные cmd, созданные в текущем окне командной строки недоступна для других процессов, но, есть возможность задать ограничения еще большие.

off =rem Начало локализации setlocal = Lokalnaya: = var1endlocal Globalnaya: = var1
Метки
Создадите файл start.bat в той же папке, где и test.bat, напишите в нем:
test.bat 2 2
Мы запустили батник, НО подали в него аргументы 2 и 2. Чтобы к ним обратиться, нужно написать %n, где “n” – номер аргумента, считая от одного(не от нуля), вот код, считающий сумму первого и второго аргумента (их может быть от нуля до 9-и):
@echo off
set /a res=%1+%2
echo res
pause
Метка – это именованное место в коде, она создается с помощью команды “:name”
А этот переходит на метку :m и продолжает выполнение, начиная с нее
rem куча кода
:m
rem куча кода
goto m
rem куча кода
И в завершение статьи, хочу сказать о команде call. Она превращает в последующей команде “%%” в “%”, а переменные – на их значения. Пример использования:
call echo %%str:~%a%,%b%%%
Подробнее о переменных
Если добавить флаг “/p”, то выводиться значение после символа “=”, а переменной задается введенное значение(запустите этот код:)
@echo off
set /p a=Enter str
echo %a%
pause
следующий код вырезает строку от символа номер “a” до символа номер “b” НЕ включительно(счет идет с нуля, отрицательные числа – счет с конца от единицы). Если аргумент один, то он присваивается числу “b”, а “a” = 0
%str:~a,b%
следующий заменяет подстроки “a” в строке на строки “b”:
%str:a=b%
Дисклеймер
Мне 12 и я сам в этой теме плохо шарю, т.к. инфы в инете мало. Пж, без хейта.
Workarounds
SET /A Whole = %Result% / 100 SET /A "Fraction = %Result% %% 100" SET Result=%Whole%.%Fraction%
This may break on the 32-bit limit, though.
In general, for floating point math I would recommend using other scripting languages.
page last modified: 2022-02-22
Наводим красоту

не делает ничего и служит комментарием к коду
rem Это самая лучшая прога в мире!!!!!
Код включает русские символы и другие из ascii(например: “╬▓☼”, можно скопировать с http://pascalguru.ru/psevdograf.html), иначе ascii символы превратятся в кракозябры:
chcp 65001
Следующий код код работает, как команда “pause”, но ничего не выводит на экран и не реагирует на нажатие клавиш(я потом объясню, как это работает).
:m
goto m
А этот – меняет заголовок окна на “name”

title name
Эта команда меняет цвет фона и текста, вместо a и b можно поставить любые шестнадцатеричные цифры(команда не сработает если a = b) см. таблицу ниже. Запись c одной буквой “а” аналогично записи “0a”
color ab

Эта – досрочно завершает программу
exit
3- Переменные аргумента (Arguments variable)
@echo off
@echo First argument is: %1
@echo Second argument is: %2
pause
Мы протестируем пример выше, открывая окно CMD, и CD к папке, содержащей файл argumentVariables.bat
Выполнить файл argumentVariables.bat с параметрами.
Workarounds
Workarounds for the 32-bit limitation include:
- dividing by 1000 (or any power of 10) by chopping off the last (3) digits
- splitting up the numbers into separate decimal digits and perform all the math and carry logic “manually”
- other scripting languages
Workaround #1 can be used to add up disk space, for example (relevant code marked red):
@ECHO OFF :: Display the disk space in MB used by the subdirectories :: of the directory represented by %1, plus a grand total PUSHD "%~1" SETLOCAL ENABLEDELAYEDEXPANSION FOR /D %%A IN (*) DO ( SET DirSize=0 SET /A Count += 1 FOR /F "tokens=1,3" %%B IN ('DIR /A-D /-C /S "%%~A"') DO ( IF %%B NEQ 0 SET DirSize=%%C ) IF !DirSize! GTR 0 SET DirSize=!DirSize:~0,-6! IF "!DirSize!"=="" SET DirSize=0 SET /A Total += !DirSize! ) ECHO. SET /A Total = %Total% + %Count% / 2 ENDLOCAL POPD
The trick is that each (big) number is treated as strings, then the rightmost 6 characters (digits) are chopped off, and only then the result is treated as a number.
This is a rather crude workaround, as it “rounds” all numbers before doing the math.
Adding half a MegaByte for each subdirectory (%Count% / 2
) to %Total%
does compensate for the truncations, though, so the grand total is more accurate than the individual numbers.
Note that the numbers don’t represent “real” MegaBytes (1024 x 1024) buth rather Million Bytes (1000 x 1000).
Workaround #2 is perfectly demonstrated by Brian Williams’ batch files:
@ECHO OFF SETLOCAL ENABLEEXTENSIONS SETLOCAL ENABLEDELAYEDEXPANSION SET _FIRST=%1 SET _SECOND=%2 CALL :ADD _FIRST _SECOND _ANSWER ECHO !_ANSWER! ENDLOCAL ENDLOCAL GOTO :END :ADD ::ADD NUMBERS LARGER THAN 32-BITS ::SYNTAX: CALL ADD _VAR1 _VAR2 _VAR3 ::VER 1.2 ::hieyeque1@gmail.com - drop me a note telling me ::if this has helped you. Sometimes I don't know if anyone uses my stuff ::Its free for the world to use. ::I retain the rights to it though, you may not copyright this ::to prevent others from using it, you may however copyright works ::as a whole that use this code. ::Just don't try to stop others from using this through some legal means. ::CopyRight Brian Williams 8/29/2009 :: _VAR1 = VARIABLE FIRST NUMBER TO ADD :: _VAR2 = VARIABLE SECOND NUMBER TO ADD :: _VAR3 = VARIABLE NUMBER RETURNED SET _RESULT= SETLOCAL SET _NUM1=!%1! SET _NUM2=!%2! IF NOT DEFINED _NUM1 SET _NUM1=0 IF NOT DEFINED _NUM2 SET _NUM2=0 FOR /L %%A IN (1,1,2) DO ( FOR /L %%B IN (0,1,9) DO ( SET _NUM%%A=!_NUM%%A:%%B=%%B ! ) ) FOR %%A IN (%_NUM1%) DO SET /A _NUM1CNT+=1 & SET _!_NUM1CNT!_NUM1=%%A FOR %%A IN (%_NUM2%) DO SET /A _NUM2CNT+=1 & SET _!_NUM2CNT!_NUM2=%%A SET _NUM1=%_NUM1: =% SET _NUM2=%_NUM2: =% SET /A _DIGITS=%_NUM1CNT% + %_NUM2CNT% IF %_DIGITS% LEQ 8 ( SET /A _RESULT=%_NUM1% + %_NUM2% ) IF DEFINED _RESULT (ENDLOCAL & SET %3=%_RESULT%& GOTO :EOF) IF %_NUM1CNT% GEQ %_NUM2CNT% (SET _MAXOPS=%_NUM1CNT%) ELSE (SET _MAXOPS=%_NUM2CNT%) SET /A _MAXOPS=%_MAXOPS% - 1 IF %_NUM1CNT% GTR %_NUM2CNT% ( SET /A _ZEROS=%_NUM1CNT% - %_NUM2CNT% FOR /L %%A IN (1,1,!_ZEROS!) DO SET _ZERO=!_ZERO!0 SET _NUM2=!_ZERO!!_NUM2! ) IF %_NUM2CNT% GTR %_NUM1CNT% ( SET /A _ZEROS=%_NUM2CNT% - %_NUM1CNT% FOR /L %%A IN (1,1,!_ZEROS!) DO SET _ZERO=!_ZERO!0 SET _NUM1=!_ZERO!!_NUM1! ) FOR /L %%A IN (!_MAXOPS!,-1,0) DO ( SET /A _TMP=!_NUM1:~%%A,1! + !_NUM2:~%%A,1! !_PLUS! !_CO! SET _CO= SET _PLUS= IF !_TMP! GTR 9 SET _CO=!_TMP:~0,1!& SET _TMP=!_TMP:~-1!& SET _PLUS=+ SET _RETURN=!_TMP!!_RETURN! SET _TMP= ) IF DEFINED _CO SET _RETURN=%_CO%%_RETURN% SET _RESULT=%_RETURN% IF DEFINED _RESULT (ENDLOCAL&SET %3=%_RESULT%) GOTO :EOF :END
@ECHO OFF SETLOCAL ENABLEEXTENSIONS SETLOCAL ENABLEDELAYEDEXPANSION SETLOCAL SET _FIRST=%1 SET _SECOND=%2 CALL :ISLARGER _FIRST _SECOND _ANSWER ECHO !_ANSWER! GOTO :END :ISLARGER ::DETERMINE IF FIRST VAR IS LARGER THAN SECOND ::NUMBERS OF UP TO ~4000 DIGITS CAN BE COMPARED, NO MORE THAN ~8100 DIGITS COMBINED ::SYNTAX: CALL ISLARGER _VAR1 _VAR2 _VAR3 ::hieyeque1@gmail.com - drop me a note telling me ::if this has helped you. Sometimes I don't know if anyone uses my stuff ::Its free for the world to use. ::I retain the rights to it though, you may not copyright this ::to prevent others from using it, you may however copyright works ::as a whole that use this code. ::Just don't try to stop others from using this through some legal means. ::CopyRight Brian Williams 5/18/2009 :: _VAR1 = VARIABLE AGAINST WHICH WE SHALL COMPARE :: _VAR2 = VARIABLE TO BE COMPARED :: _VAR3 = VARIABLE WITH TRUE/FALSE RETURNED SET _NUM1=!%1! SET _NUM2=!%2! SET _RESULT=%3 FOR /L %%A IN (1,1,2) DO ( FOR /L %%B IN (0,1,9) DO ( SET _NUM%%A=!_NUM%%A:%%B=%%B ! ) ) FOR %%A IN (!_NUM1!) DO SET /A _NUM1CNT+=1 & SET _!_NUM1CNT!_NUM1=%%A FOR %%A IN (!_NUM2!) DO SET /A _NUM2CNT+=1 & SET _!_NUM2CNT!_NUM2=%%A IF !_NUM1CNT! NEQ !_NUM2CNT! ( IF !_NUM1CNT! GTR !_NUM2CNT! ( SET !_RESULT!=TRUE GOTO :EOF ) ELSE ( SET !_RESULT!=FALSE GOTO :EOF ) ) FOR /L %%A IN (1,1,!_NUM1CNT!) DO ( IF !_%%A_NUM1! NEQ !_%%A_NUM2! ( IF !_%%A_NUM1! GTR !_%%A_NUM2! ( SET !_RESULT!=TRUE GOTO :EOF ) ELSE ( SET !_RESULT!=FALSE GOTO :EOF ) ) ) SET !_RESULT!=EQUAL GOTO :EOF :END
@ECHO OFF SETLOCAL ENABLEEXTENSIONS SETLOCAL ENABLEDELAYEDEXPANSION SETLOCAL SET _FIRST=%1 SET _SECOND=%2 CALL :MULTIPLY _FIRST _SECOND _ANSWER ECHO !_ANSWER! GOTO :END :MULTIPLY ::MULTIPLY NUMBERS LARGER THAN 32-BITS ::SYNTAX: CALL MULTIPLY _VAR1 _VAR2 _VAR3 ::VER 1.2 - Fixed ending carry over bug - Thanks Justin ::hieyeque1@gmail.com - drop me a note telling me ::if this has helped you. Sometimes I don't know if anyone uses my stuff ::Its free for the world to use. ::I retain the rights to it though, you may not copyright this ::to prevent others from using it, you may however copyright works ::as a whole that use this code. ::Just don't try to stop others from using this through some legal means. ::CopyRight Brian Williams 5/18/2009 :: _VAR1 = VARIABLE AGAINST WHICH WE SHALL COMPARE :: _VAR2 = VARIABLE TO BE COMPARED :: _VAR3 = VARIABLE WITH TRUE/FALSE RETURNED SET _NUM1=!%1! SET _NUM2=!%2! SET _RESULT=%3 FOR /L %%A IN (1,1,2) DO ( FOR /L %%B IN (0,1,9) DO ( SET _NUM%%A=!_NUM%%A:%%B=%%B ! ) ) FOR %%A IN (!_NUM1!) DO SET /A _NUM1CNT+=1 & SET _!_NUM1CNT!_NUM1=%%A FOR %%A IN (!_NUM2!) DO SET /A _NUM2CNT+=1 & SET _!_NUM2CNT!_NUM2=%%A IF !_NUM1CNT! EQU 1 IF !_NUM2CNT! EQU 1 ( SET /A !_RESULT!=!_NUM1! * !_NUM2! GOTO :EOF ) FOR /L %%B IN (!_NUM2CNT!,-1,1) DO ( FOR /L %%A IN (!_NUM1CNT!,-1,1) DO ( SET /A _TMP=!_%%B_NUM2! * !_%%A_NUM1! !_PLUS! !_CO! SET _CO= SET _PLUS= IF !_TMP! GTR 9 SET _CO=!_TMP:~0,1!& SET _TMP=!_TMP:~-1!& SET _PLUS=+ SET _NUM3_%%B=!_NUM3_%%B!!_SPC!!_TMP! SET _SPC= SET _TMP= ) IF DEFINED _CO SET _NUM3_%%B=!_NUM3_%%B! !_CO!& SET _CO=& SET _PLUS= SET _NUM3_%%B=!_ZERO!!_NUM3_%%B! SET _ZERO=0!_SPC1!!_ZERO! SET _SPC1= FOR %%A IN (!_NUM3_%%B!) DO ( SET /A _CNT+=1 FOR %%C IN (!_CNT!) DO SET _NUM4_%%C=!_NUM4_%%C!%%A+ ) SET _CNT= ) FOR /F %%A IN ('SET _NUM4') DO SET /A _COLCNT+=1 FOR /L %%A IN (1,1,!_COLCNT!) DO SET /A _NUM5_%%A=!_NUM4_%%A:~0,-1! FOR /L %%A IN (1,1,!_COLCNT!) DO ( IF DEFINED _CO SET /A _NUM5_%%A=!_NUM5_%%A! + !_CO! SET _CO= IF !_NUM5_%%A! GTR 9 ( SET _CO=!_NUM5_%%A:~0,-1! SET _NUM6=!_NUM5_%%A:~-1!!_NUM6! ) ELSE ( SET _NUM6=!_NUM5_%%A!!_NUM6! ) SET !_RESULT!=!_CO!!_NUM6! ) GOTO :EOF :END
Perfect, but quite complex.
Workaround #3, other scripting languages, is self-explanatory.
I have often used temporary scripts, created “on-the-fly” by the batch file.
Don’t forget to clean up the “mess” afterwards.
The temporary script could be in any language supported on the computer.
The most commonly supported scripting languages nowadays are VBScript and JScript.
PowerShell comes close, but PowerShell scripts are often restricted for security reasons.
Temporary VBScript or JSCript scripts need to be saved in temporary files before they can be “executed”.
PowerShell code doesn’t need to be saved to a script file first, as Kevin Ridenhour, L SFC RET, taught me:
@ECHO OFF :: Display the disk space in MB used by the subdirectories :: of the directory represented by %1, plus a grand total PUSHD "%~1" SETLOCAL ENABLEDELAYEDEXPANSION FOR /D %%A IN (*) DO ( SET DirSize=0 FOR /F "tokens=1,3" %%B IN ('DIR /A-D /-C /S "%%~A"') DO ( IF %%B NEQ 0 SET DirSize=%%C ) IF !DirSize! GTR 0 ( ) ECHO.!DirSize! MB %%~fA ) ECHO. ECHO.%Total% MB Total ENDLOCAL POPD
Well, what I meant to demonstrate is that you can use PowerShell one-liners in batch files without the need for (temporary) script files.
But why not just create a PowerShell script instead?
Good question.
For this particular example, it would probably be a better choice indeed.
But there may be a very important argument to choose for batch files with embedded PowerShell commands: PowerShell scripts ususally require code signing, whereas command line use does not.
An alternative to PowerShell are PHP based batch files, but they require PHP to be installed.
PHP is extremely good at math.
4- Рамки переменной
Когда командное окно (Command Window) открывается, оно начнет сеанс работы (session). Тот сеанс работы завершится когда закроется командное окно. Во время сеанса работы вы можете выполнить один или много файлов batch. Переменные созданные в предыдущих файлах могут быть доступны в следующих файлах. Такие переменные называются глобальными переменными (Global Variable). Но вы можете создать локальную переменную (Local Variable), локальная переменная существует только в файле определяющей ее, или только существует в коде того файла.
Пример локальной переменной (Local Variables)
Локальные переменные (Local variable) объявлены в блоке, начинаются с setlocal и заканчиваются на endlocal.
@echo off
set global1=I am a global variable 1
setlocal
set local1=I am a local variable 1
set local2=I am a local variable 2
echo ----- In Local Block! -----
echo local1= %local1%
echo local2= %local2%
endlocal
echo ..
echo ----- Out of Local Block! -----
echo global1= %global1%
echo local1= %local1%
echo local2= %local2%
pause
Пример глобальной переменной (Global Variables):
Переменные объявлены в файле Batch, и не находятся в блоке команд setlocal .. endlocal, будут глобальными переменными. Они могут быть использованы в других файлах в одном и том же сеансе работы (Session).
В данном примере у нас есть 2 файла batchFile1.bat и batchFile2.bat. Переменная MY_ENVIRONMENT определяется в файле 1, и используется в файле 2.
@echo off
set MY_ENVIRONMENT=C:/Programs/Abc;C:/Test/Abc
@echo off
echo In batchFile2.bat
echo MY_ENVIRONMENT=%MY_ENVIRONMENT%
Открыть окно CMD, и CD к папке содрежащей файл batchFile1.bat, batchFile2.bat, запустить поочередно каждый файл.
Циклы и условия
Цикл можно создать с помощью команды “for”, синтаксис следующий:
for %%i in (a b c) do (
cmd
)
for %%i in (a b c) do cmd
(a b c) это список (не обязательно из 3-х элементов) и переменная %%i (нужно ставить символ после процентов, а не между) по очереди проходит по значениям в списке
Если добавить флаг “/l”, то переменная в первый раз будет равна “a”. К ней каждый раз будет прибавляться “b”, пока она не станет больше “c”(тут размер ДОЛЖЕН равняться 3)
запустите этот код, тут все наглядно
@echo off
chcp 65001
echo Начало
for /l %%i in (1 1 10) do echo %%i
echo Конец
pause
Команда if выполняет код, если условие верно (или если поставить not после if, когда НЕ верно), вот операторы сравнения:
P.S. строки нужно брать в кавычки “%str%”==”Hello”
@echo off
set /p a=Enter number
if a gtr 0 echo positive else\
if a equ 0 echo 0 else echo negative
pause
в 3-ей строке, если “a” > 0 выводиться “положительный”(на английском 🙂 ), если равен – 0,в 4-ой если меньше – “отрицательный”
символ “\” означает, что команда продолжается на следующей строке
External linksEdit
- Windows CMD Commands at ss64.com — licensed under Creative Commons Attribution-Non-Commercial-Share Alike 2.0 UK: England & Wales[1], and thus incompatible with CC-BY-SA used by Wikibooks
- Windows XP – Command-line reference A-Z at microsoft.com
- Windows Server 2008R2 – Command-Line Reference at microsoft.com
- Windows Server 2012R2 – Command-Line Reference at microsoft.com
- Windows Server 2016 – Windows Commands at microsoft.com
- The FreeDOS HTML Help at fdos.org — a hypertext help system for FreeDOS commands, written in 2003/2004, available under the GNU Free Documentation License
- Category:Batch File, rosettacode.org
- Cmd.exe, wikipedia.org
- Batch file, wikipedia.org
5- Переменные среды Windows
Windows позволяет вам создать переменные среды, данные переменные будут глобальными переменными, которые можно использовать в любых файлах batch.
В Windows выберите:
- Start Menu/Control Panel/System
- Advanced (Tab) > Environment Variables..
Например, я создаю переменную среды с названием MY_ENVIRONMENT_VARIABLE и значением “My Environment Variable Value!”.
И можно использовать только что созданную переменную среду в файле batch.
@echo off
echo %MY_ENVIRONMENT_VARIABLE%
pause
Limitations
There is a severe limitation in batch math: it can only handle 32-bit integers.
In Windows NT 4 and possibly 2000, the limitation is even worse: it can only handle unsigned 32-bit integers.
2- Распространенные переменные
Язык Batch не имеет ясное понятие о виде данных, обычно переменная имеет значение строки (string), включая символы после знака = до конца строки (Включая пробелы если есть).
Если вы хотите объявить переменную как число, вам нужно использовать команду set /A
Для получения доступа в значение переменной, вам нужно закрыть (enclosed) заключить ту переменную в скобках со знаками %.
@echo off
set name=Tran
set /A age= 37
echo %name%
echo %age%
set info=My Name is: %name%, Age: %age%
echo %info%
pause
@echo off
set /A a = 100
set /A b = 200
echo a = %a%
echo b = %b%
set /A sum = a + b
echo Sum = %sum%
pause
And some tricks
To save yourself from writing all the arguments for the FOR command you can use MACRO for assigning the result to variable:
@echo off
::::: ---- defining the assign macro ---- ::::::::
setlocal DisableDelayedExpansion
(set LF=^
%=EMPTY=%
)
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
::set argv=Empty
set assign=for /L %%n in (1 1 2) do ( %\n%
if %%n==2 (%\n%
setlocal enableDelayedExpansion%\n%
for /F "tokens=1,2 delims=," %%A in ("!argv!") do (%\n%
for /f "tokens=* delims=" %%# in ('%%~A') do endlocal^&set "%%~B=%%#" %\n%
) %\n%
) %\n%
) ^& set argv=,
::::: -------- ::::::::
:::EXAMPLE
%assign% "WHOAMI /LOGONID",result
echo %result%
the first argument to the macro is the command and the second the name of the variable we want to use and both are separated by ,
(comma). Though this is suitable only for straight forward scenarios.
If we want a similar macro for the console we can use DOSKEY
doskey assign=for /f "tokens=1,2 delims=," %a in ("$*") do @for /f "tokens=* delims=" %# in ('"%a"') do @set "%b=%#"
rem -- example --
assign WHOAMI /LOGONID,my-id
echo %my-id%
FOR also works well with pipes which can be used for chaining commands (though it is not so good for assigning a variable.
hostname |for /f "tokens=* delims=" %%# in ('more') do @(ping %%#)
Which also can be beautified with macros:
@echo off
:: --- defining chain command macros ---
set "result-as-[arg]:=|for /f "tokens=* delims=" %%# in ('more') do @("
set "[arg]= %%#)"
::: -------------------------- :::
::Example:
hostname %result-as-[arg]:% ping %[arg]%
And for completnes macros for the temp file approach (no doskey definition ,but it also can be easy done.If you have a SSD this wont be so slow):
@echo off
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set "[[=>"#" 2>&1&set/p "&set "]]==<# & del /q # >nul 2>&1"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
chcp %[[%code-page%]]%
echo ~~%code-page%~~
whoami %[[%its-me%]]%
echo ##%its-me%##
For /f with another macro:
::::::::::::::::::::::::::::::::::::::::::::::::::
;;set "{{=for /f "tokens=* delims=" %%# in ('" &::
;;set "--=') do @set "" &::
;;set "}}==%%#"" &::
::::::::::::::::::::::::::::::::::::::::::::::::::
:: --examples
::assigning ver output to %win-ver% variable
%{{% ver %--%win-ver%}}%
echo 3: %win-ver%
::assigning hostname output to %my-host% variable
%{{% hostname %--%my-host%}}%
echo 4: %my-host%
Переменные
Создать переменную можно с помощью команды set, синтаксис объявления следующий: P.S. это не совсем переменные, это скорее макросы (для тех к кто не знает C/C++ это именованный кусочек кода, имя которого заменяется на этот кусочек кода)
set a=Hello world
Если после “set” добавить флаг “/a” то:
Переменной задастся значение выражения, а не его текст, например:
set a=2+2 > 2+2 set /a a=2+2 > 4
Переменной можно присвоить ТОЛЬКО числовое значение
Чтобы обратиться к переменной, нужно окружить ее символами “%” (так %name%), пример кода:
set /a a=%b%+%b%
echo %a%