batch-file
Лучшие практики
Поиск…
Вступление
В этом разделе основное внимание будет уделено тем, что нужно (не обязательно) делать в пакетном файле. Использование этих «лучших практик» может улучшить эффект и функцию командного файла.
Цитаты
Большинство онлайн-скриптов имеют множество проблем с котировками.
Примеры и решения
Пример А
if %var%==abc echo Test
Этот код работает - когда содержимое %var%
не содержит пробела или других специальных символов. Предположим теперь, что %var%
содержит 1 пробел. Теперь cmd.exe
видит:
if ==abc echo Test
Это приведет к сбою, потому что cmd.exe
не понимает этот синтаксис.
Решение A
if "%var%"=="abc" echo Test
Используя кавычки, cmd.exe
видит весь %var%
(включая пробел и специальные символы) как только одну нормальную строку. Однако это не самый безопасный метод сравнения. Самый безопасный использует echo
, pipe
и findstr
.
Пример B
cd C:\User\Spaced Name\Spaced FileName.txt
cd
изменит каталог только на C:\User\Spaced
, так как cd
принимает только один аргумент пути.
Решение B
Просто добавив цитаты вокруг пути, проблема будет решена.
cd "C:\User\Spaced Name\Spaced FileName.txt"
Есть также несколько примеров, которые лучше работают с использованием кавычек, таких как оператор set /a
и т. Д. Но, когда вы работаете с строками, которые содержат пробелы или специальные символы, обычно использовать безопасные кавычки.
Код спагетти
Код спагетти означает фрагмент кода, который использует многие, и часто запутывающие структуры. Такие, как GOTO
, исключения и непоследовательный код.
Примеры и решения
Пример А
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
if %counter% equ 10 goto :exit
goto :Loop
:exit
Эта программа поставляется с большим количеством прыжков, что затрудняет нам понимание того, что именно делает скрипт.
Решение A
@echo off
for /l %%G in (0,1,10) echo %%G
Используя меньше GOTO
, мы значительно сократили объем кода, и мы можем сосредоточиться на фактическом коде.
Пример B
Рассмотрим следующие утверждения.
:endGame
if %player1Score% gtr %player2Score% goto :player1wins
if %player1Score% lss %player2Score% goto :player2wins
goto :tie
:player1wins
echo player 1 wins
goto :eof
:player2wins
echo player 2 wins
goto :eof
:tie
echo tie
goto :eof
Этот фрагмент требует много goto
и может быть запутанным для отладки. Чтобы упростить эти утверждения, мы можем использовать команду call
. Вот приведенный выше сценарий в лучшем состоянии.
:endGame
if %player1Score% gtr %player2Score% call :message player 1 wins
if %player1Score% lss %player2Score% call :message player 2 wins
if %player1Score% equ %player2Score% call :message tie
goto :eof
:message
echo %*
goto :eof
Оба сценария выводят тот же результат, но новый скрипт намного короче и яснее.