существует ли специальное руководство, которому необходимо следовать
Не существует "стандартного" способа создания пакетных файлов, потому что подавляющее большинство их авторов и сопровождающих либо не понимаютконцепции программирования, или они думают, что они не применимы к пакетным файлам.
Но я программист.Я привык к компиляции, и я привык к отладчикам.Пакетные файлы не компилируются, и вы не можете запустить их через отладчик, поэтому они заставляют меня нервничать.Я предлагаю вам быть очень строгими в отношении того, что вы пишете, поэтому вы можете быть уверены, что оно будет делать то, что вы думаете.
Существуют некоторые стандарты кодирования, которые говорят: если вы пишете оператор if
, выдолжны использовать фигурные скобки, даже если у вас нет предложения else
.Это избавляет вас от тонких, трудных для отладки проблем и однозначно читается.Я не вижу причин, по которым вы не могли бы применить это рассуждение к пакетным файлам.
Давайте посмотрим на ваш код.
IF EXIST somefile.txt IF EXIST someotherfile.txt SET var=somefile.txt,someotherfile.txt
И синтаксис IF
из команды HELP IF
:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXISTS filename command
...
IF EXIST filename (
command
) ELSE (
other command
)
Таким образом, вы объединяете IF
в качестве команд.
Если вы используете общее правило кодирования, которое я упоминал выше, вы всегда захотите использовать парены,Вот как вы могли бы сделать это для вашего примера кода:
IF EXIST "somefile.txt" (
IF EXIST "someotherfile.txt" (
SET var="somefile.txt,someotherfile.txt"
)
)
Убедитесь, что вы правильно отформатировали и сделали некоторые отступы.Вы делаете это в коде, и вы должны делать это в своих пакетных сценариях.
Кроме того, вы должны также иметь привычку всегда заключать в кавычки имена ваших файлов и получать правильные цитаты.В словах HELP FOR
и HELP SET
есть несколько слов, которые помогут вам удалить лишние кавычки при повторном цитировании строк.
Редактировать
Из ваших комментариев иперечитывая исходный вопрос, кажется, что вы хотите создать список существующих файлов через запятую.В этом случае вы могли бы просто использовать кучу операторов if
/ else
, но это привело бы к куче дублированной логики и было бы совсем не чисто, если у вас было больше двух файлов.
Лучший способ - написать подпрограмму , которая проверяет существование отдельного файла и добавляет к переменной, если указанный файл существует.Затем просто вызовите эту подпрограмму для каждого файла, который вы хотите проверить:
@ECHO OFF
SETLOCAL
REM Todo: Set global script variables here
CALL :MainScript
GOTO :EOF
REM MainScript()
:MainScript
SETLOCAL
CALL :AddIfExists "somefile.txt" "%files%" "files"
CALL :AddIfExists "someotherfile.txt" "%files%" "files"
ECHO.Files: %files%
ENDLOCAL
GOTO :EOF
REM AddIfExists(filename, existingFilenames, returnVariableName)
:AddIfExists
SETLOCAL
IF EXIST "%~1" (
SET "result=%~1"
) ELSE (
SET "result="
)
(
REM Cleanup, and return result - concatenate if necessary
ENDLOCAL
IF "%~2"=="" (
SET "%~3=%result%"
) ELSE (
SET "%~3=%~2,%result%"
)
)
GOTO :EOF