Если я попытаюсь установить переменную с обратной косой чертой, это вызовет ошибку.
if %errorlevel% equ 3 set crntPath=%crntPath%!directories[%%n]!
Я просто хочу добавить Acer\ к C:\Users\Program Files (x86)\
но это дает мне ошибку:
\!directories[%n]! was unexpected at this time.
Я не понимаю, почему он это делает, я могу добавить Acer\ к C:\Users\Program Files\, но не C:\Users\Program Files (x86)\.
Вот полный исходный код:
@echo off
setlocal enabledelayedexpansion
set crntPath=C:\Program Files (x86)\
set dontrepeat=0
:getFiles
for /l %%n in (1,1,250) do (
set "files[%%n] = "
set "directories[%%n] = "
)
set pointing=1
set /a count=1
for /f "delims = " %%i in ('dir "%crntPath%" /B /AD') do (
set directories[!count!]=%%i
set /a count+=1
)
set oldcount=%count%
for /f "delims = " %%i in ('dir "%crntPath%" /B /A-D') do (
set files[!count!]=%%i
set /a count+=1
)
set directories[0]=..
goto main
:outputFiles
cls
set dontrepeat=1
echo %crntPath%
for /l %%n in (0,1,%count%) do (
if "!directories[%%n]!" neq "" (
if %pointing% equ %%n (
if %pointing% equ 0 (
if %errorlevel% equ 3 for %%D in ("%crntPath:~0,-1%") do set crntPath=%%~dpD&goto getFiles
) else (
if %errorlevel% equ 3 set crntPath=%crntPath%!directories[%%n]!
rem error???
)
echo [DIR] !directories[%%n]!
) else (
echo !directories[%%n]!
)
)
)
for /l %%n in (%oldcount%,1,%count%) do (
if "!files[%%n]!" neq "" (
if %pointing% equ %%n (
if %errorlevel% equ 3 "%crntPath%!files[%%n]!"
echo [FILE] !files[%%n]!
) else (
echo !files[%%n]!
)
)
)
goto main
:main
if %dontrepeat% equ 0 goto outputFiles
choice /c zxc /n
if %errorlevel% equ 1 set /a pointing-=1 & if !pointing! lss 0 (set /a pointing=%count%-1)
if %errorlevel% equ 2 set /a pointing+=1 & if !pointing! geq %count% (set /a pointing=0)
set dontrepeat=0
goto outputFiles
Я пробовал переключить все обратные косые черты на прямые, но это все равно не работает.
Информация в моем ответе о символе , эквивалентном NEQ, LSS, GTR и т. д. в пакетных файлах Windows , также может быть для вас полезной. Для сравнения двух строк можно использовать операторы целочисленного сравнения neq и equ, но лучше использовать операторы сравнения строк not "…" == "…" и "…" == "…". Запустите в окне cmd if /? и прочитайте справку по использованию выходных данных, а также Как не дать интерпретатору команд Windows прекратить выполнение пакетного файла при неправильном вводе пользователя?





Это происходит из-за круглых скобок в значении вашей переменной. Но теоретически проблема может заключаться в любом специальном символе, оскорбительном для пакетного сценария. Лучше объявить в двойных кавычках: -
set crntPath = "C:\Program Files (x86)\"
Конечно, вам придется изменить свой сценарий, чтобы учесть это конкретное изменение. (Например. dir %crntPath% /b /a-d)
Если вы хотите добавить что-то к нему, вы можете сделать: -
for /f "tokens=*" %%i in (%crntPath%) do set crntPath = "%%~i!directories[%%n]!"
Использование двойных кавычек обычно рекомендуется для всех путей, особенно если они хранятся в переменных.
Лучше всего не включать кавычки в значение переменной. Но вы должны использовать кавычки, чтобы заключить назначение переменной. Затем используйте кавычки вокруг полного пути к любому файлу или ссылке на путь.
Я настоятельно рекомендую прочитать главы с общими вопросами в этом ответе и поучиться на них для своего командного файла. Также следует прочитать: Почему после использования «set var = text» в командной строке не выводится строка с «echo %var%»? Строку
set crntPath=C:\Program Files (x86)\лучше писать какset "crntPath=%ProgramFiles(x86)%\". Строкаset /a count=1должна бытьset count=1илиset "count=1"без опции/aдля арифметического выражения, поскольку в этом случае она определенно не нужна.