Привет, я пишу пакетный скрипт , который будет работать на Windows XP машине. Этот сценарий должен иметь возможность надежной проверки того, что каталог, переданный в качестве параметра командной строки, действительно существует.
Предполагая, что мой сценарий называется script.bat , он должен поддерживать следующие параметры в качестве допустимых параметров командной строки:
C:\> script.bat C:
C:\> script.bat C:\
C:\> script.bat ..\photos
C:\> script.bat C:\WINDOWS
C:\> script.bat "C:\Documents and Settings"
C:\> script.bat "C:\Documents and Settings\"
C:\> script.bat F:\music\data\
C:\> ...
По сути, должно быть разрешено указывать букву диска с обратной косой чертой или без нее, а также полное, абсолютное или относительное имя пути с обратной косой чертой или без нее (с пробелами в некоторых каталогах или без них). имя (ы)). Имя ДОЛЖНО заключаться в кавычки, очевидно, если оно содержит пробелы, чтобы интерпретировать их как один параметр. Тем не менее, кавычки должны быть разрешены для имен, где они не требуются иным образом:
C:\> script.bat "F:\music\data\"
Моя первая попытка выглядит так:
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
IF ErrorLevel 1 GOTO :NoExtensions
IF "%~1"=="" GOTO :NoDirectory
SET dir=%~1\NUL
ECHO You provided: %1
ECHO Testing using: %dir%
IF NOT EXIST %dir% GOTO :BadDirectory
SET dir=%~f1\
ECHO The following is valid: %dir%
REM
REM Other script stuff here...
REM
GOTO :EOF
:NoExtensions
ECHO This batch script requires extensions!
GOTO :EOF
:NoDirectory
ECHO You must provide a directory to validate!
GOTO :EOF
:BadDirectory
ECHO The directory you specified is invalid!
Проблема main в том, что она не работает, если указан путь со встроенными пробелами:
C:\script.bat "C:\Documents and Settings"
...
'and' is not recognized as an internal or external command,
operable program or batch file.
Итак, я попытался процитировать переменную% dir% следующим образом:
IF NOT EXIST "%dir%" GOTO :BadDirectory
Заключение в кавычки, как указано выше, работает при использовании «ЕСЛИ НЕ СУЩЕСТВУЕТ» для прямой проверки файлов, но не работает вообще при использовании трюка «dir \ NUL» для проверки каталогов.
Другой недостаток в исходной версии заключается в том, что если% 1 - это C: тогда версия переменной% ~ f1 всегда, кажется, дает мой текущий рабочий каталог вместо C: или C: \, как было бы более полезно. Я не совсем уверен, что лучший способ обойти это тоже.
Любая помощь или комментарии будут очень оценили!
-
Подпись: жаль, что я вместо этого писал сценарии оболочки bash, ruby или что-то еще ...