Проверка наличия файла / каталога
Код, который вы используете для проверки существования каталога (?):
set %~3= dir /p|find /C "%~2"
Я не думаю, что это делает то, что вынамерены.SET /P
часто используется таким образом, чтобы передать вывод команды в переменную окружения.(Хотя вы даете от /P
до dir
, что разбивает на страницы вывод - возможно, не то, что вы хотели.) Однако команда, которая у вас есть, этого не сделает.Я предполагаю, что для этого нужно установить переменную (буквально) "dir / p", а затем передать это через find-count.Эти результаты find.exe /C
никогда не возвращаются в envvar.Выходная строка "0" является результатом передачи (ничего) через find.exe /C
.
Я предлагаю более простой тест на существование:
IF EXIST "%~2" (SET /A %~3=1) ELSE (SET /A %~3=0)
Этот тест работал на моей машине Win10.
Я видел некоторые различия в том, как работает IF EXIST
.Если вы не хотите использовать это, вы можете сделать это с помощью цикла FOR
.
FOR /F "tokens=*" %%e IN ('DIR /B') DO IF "%%~e"=="%~2" SET /A %~3=1
Если вы хотите использовать канал в команде FOR, вам придется его избежать.
FOR /F "tokens=*" %%e IN ('DIR /B ^| find /C "%~2"') DO SET /A %~3=%%~e
Все три из этих методов работали для меня.
SETLOCAL
Я не думаю, что существует официальное справочное руководство по синтаксису cmd, кроме встроенногоhelp (SETLOCAL /?
)
Мой опыт показывает, что он помещает все envvars и рабочие каталоги в «стек» и соответствующие ENDLOCAL
или EXIT
(хотя в сценариях вы почти * 1035)* всегда хочу использовать EXIT /B
) вытолкнет окружение из этого "стека".По сути, это означает, что изменения envvar / CWD, сделанные вами в SETLOCAL
, будут только временными.