Поиск…


Вступление

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

Цитаты

Большинство онлайн-скриптов имеют множество проблем с котировками.


Примеры и решения

Пример А

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

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow