Используйте пакетный файл, чтобы проверить, находятся ли файлы с определенным расширением в определенной папке - PullRequest
0 голосов
/ 31 мая 2018

В пакетном файле мне нужно получить путь от пользователя, удалить обратную косую черту, если они его включили, а затем проверить, находятся ли какие-либо файлы с расширением .sql в указанной папке.Если нет, я хочу вернуть их в раздел ввода переменных.

Вот что у меня есть:

REM Get the folder paths from the user
:setfolderpaths
set /p SCRIPTFOLDER="D:\Mark\Centriq Extraction Projects\"
set /p OUTPUTFOLDER="D:\Mark\Centriq Extraction Projects\"

REM View what the user entered (testing only)
echo %SCRIPTFOLDER%
echo %OUTPUTFOLDER%

REM pause here to check the user entry (testing only)
@pause

REM Remove trailing slashes from the folder path if they exist
if %SCRIPTFOLDER:~-1%==\ set SCRIPTFOLDER=%SCRIPTFOLDER:~0,-1%
if %OUTPUTFOLDER:~-1%==\ set OUTPUTFOLDER=%OUTPUTFOLDER:~0,-1%

REM If the folder the user entered doesn't exist, go back to the folder entry section
if not exist %SCRIPTFOLDER% + "\*.sql" (
    goto setfolderpaths
)

Однако, когда я запускаю файл, после того, как я нажимаю клавишу, чтобы продолжить вПауза, окно cmd закрывается немедленно.Я проверил, что строки, удаляющие обратную косую черту, работают, поэтому проблема, кажется, в моей проверке if not exist.

РЕДАКТИРОВАТЬ Очевидно, у меня был некоторый код в моем примере, который сбивал с толкучто я пытаюсь выяснить.Я добавил комментарии, чтобы объяснить, что я делаю в каждой части.Мне просто нужно выяснить, почему мои файлы проверки для ..sql в указанной пользователем папке не работают.

ОБНОВЛЕНИЕ

Хорошо, я очистил свою цитатувыдает по предложениям @LotPings.

Итак, когда я ставлю эхо прямо перед проверкой if:

echo %SCRIPTFOLDER%
@pause

Это показывает действительный путь, который, как я знаю, делает *В 1024 * есть файлы sql.Так что этот код не работает:

if not exist "%SCRIPTFOLDER%\*.sql" (
    goto setfolderpaths
)

Когда я нажимаю клавишу, чтобы продолжить на паузе, окно cmd закрывается.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Прочитайте ответ на Почему после использования команды 'set var = text' в командной строке не выводится строка с 'echo% var%'? и вы знаете, что не так в первых двух SET командные строки.

Исходный вопрос: Пути к папкам присваиваются переменным среды с двумя двойными кавычками, поэтому последний символ обоих значений переменной среды равен ", а необратная косая черта, как и ожидалось.

Отредактированный вопрос: Два пути к папкам отображаются в виде текста приглашения.

Неправильная позиция первого " в Командные строки SET отвечают за синтаксические ошибки в оставшихся строках, а также + в IF условной строке.Командный процессор Windows не поддерживает конкатенацию строк с использованием оператора +.Строки для конкатенации должны быть просто записаны конкатенацией в пакетном файле.

Вот пакетный файл, который запрашивает у пользователя оба пути и выполняет некоторые проверки, поскольку у пользователя есть свобода ввода ничего или строк, которые могут сделатьчто-то действительно плохое без соответствующих проверок в правильной последовательности без использования отложенного расширения переменной среды.Командные строки изменяются командным процессором Windows перед выполнением каждой ссылкой %ScriptFolder% и %OutputFolder%.Это никогда не имеет значения, что написано в пакетном файле.Имеет значение, как выглядит каждая командная строка или весь командный блок после синтаксического анализа командным процессором Windows cmd.exe при выполнении пакетного сценария.

@echo off

:GetScriptFolderPath
set "ScriptFolder="
set /P "ScriptFolder=Enter script folder path: "

rem Has the user not entered any string?
if not defined ScriptFolder goto GetScriptFolderPath

rem Remove all double quotes from entered string.
set "ScriptFolder=%ScriptFolder:"=%"

rem Has the user entered a string consisting only of double quotes?
if not defined ScriptFolder goto GetScriptFolderPath

rem Remove a backslash at end of user entered string.
if "%ScriptFolder:~-1%" == "\" set "ScriptFolder=%ScriptFolder:~0,-1%"

rem Has the user entered just a backslash (with one or more double quotes)?
if not defined ScriptFolder goto GetScriptFolderPath

rem Is the user entered string really a path to a directory
rem which really exists and contains at least one *.sql file?
if not exist "%ScriptFolder%\*.sql" goto GetScriptFolderPath

:GetOutputFolderPath
set "OutputFolder="
set /P "OutputFolder=Enter output folder path: "
if not defined OutputFolder goto GetOutputFolderPath
set "OutputFolder=%OutputFolder:"=%"
if not defined OutputFolder goto GetOutputFolderPath
if "%OutputFolder:~-1%" == "\" set "OutputFolder=%OutputFolder:~0,-1%"
if not defined OutputFolder goto GetOutputFolderPath

rem Is the user entered string really a path to an existing directory?
if not exist "%OutputFolder%\" goto GetOutputFolderPath

Примечание: Пользователь пакетного файла можеттакже перетащите и перетащите путь к папке, например, из проводника Windows в окно консоли, чтобы ввести путь, и для этого необходимо нажать только RETURN или ENTER , чтобы завершить запрос ввода.

Можно также использовать set "ScriptFolder=D:\Mark\Centriq Extraction Project" вместо просто set "ScriptFolder=", чтобы определить непустое значение по умолчанию, при котором пользователь должен просто нажать RETURN или ENTER для его использования.,Путь к папке по умолчанию также может быть установлен для выходной папки.

0 голосов
/ 31 мая 2018

Это все проблемы с цитированием.

Если двойная кавычка является последним символом (как в случае выше), и вы удалите его,
строка имеет только начальную кавычку и все еще обратную косую черту.

Лучшая цитата всегда такая:

:setfolderpaths
set "SCRIPTFOLDER=D:\Mark\Centriq Extraction Projects\"
set "OUTPUTFOLDER=D:\Mark\Centriq Extraction Projects\"

echo %SCRIPTFOLDER%
echo %OUTPUTFOLDER%

@pause

REM Remove trailing slashes from the folder path if they exist
if "%SCRIPTFOLDER:~-1%"=="\" set "SCRIPTFOLDER=%SCRIPTFOLDER:~0,-1%"
if "%OUTPUTFOLDER:~-1%"=="\" set "OUTPUTFOLDER=%OUTPUTFOLDER:~0,-1%"

if not exist "%SCRIPTFOLDER%\*.sql" (
    goto setfolderpaths
)

Также нет конкатенации строк с +, которую вы использовали в if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...