Причина, по которой это не работает в пакете, заключается в одной раздражающей функции операторов IF
с командой SET
.Как указано This Post - "cmd
расширяет переменные при разборе команд, а не при их выполнении. Бывает, что оператор if
или for
с блоком ( ... )
(илифактически любой блок) в этом случае объединяется в одну команду, поэтому, когда вы устанавливаете переменные внутри блока и пытаетесь использовать их в одном и том же блоке, переменных больше нет - они были заменены значениями, которые переменные имели до того, как блок был выполнен."- Джои
Чтобы исправить это, вы можете просто не помещать свой блок кода в оператор IF
, а использовать ELSE
и иметь его goto
и :EOF
Вариант 1: - Избегать IF
Заявление Ш / В Кодовый блок
@ECHO OFF
Rem | Check If Directory Exists & pushd It.
if exist "C:\$Recycle.Bin" (pushd "C:\$Recycle.Bin") ELSE (goto :EOF)
Rem | Grab data on folders
for /F "delims=" %%a in ('dir /S /b S-1-*-1001 /AD') do (set "{File}=%%a")
Rem | Display data on folders
for %%a in ("%{file}%") do (echo Recycle Bin: %%~ta)
Rem | Un-pushd
popd
pause
goto :EOF
Если вы все же хотите использовать блок внутриIF
statment вы должны будете использовать setlocal enabledelayedexpansion
вверху вашего скрипта.Кроме того, для вывода или чтения скобок вам придется использовать !{File}!
сверх %{File}%
.
Вариант 2: - правильно развернуть IF
Оператор Ш / Ч Кодовый блок
@ECHO OFF
@setlocal enabledelayedexpansion
if exist "C:\$Recycle.Bin" (
pushd "C:\$Recycle.Bin"
for /F "delims=" %%a in ('dir /S /b S-1-*-1001 /AD') do (set "{File}=%%a")
for %%a in ("!{file}!") do (
Set "data=%%~ta"
echo Recycle Bin: !data!
)
popd
) Else (Goto :EOF)
pause
goto :EOF