Команда работает в командной строке, но неожиданно работает в командном файле - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть этот простой пакетный код для проверки даты изменения в подпапке (в частности, в корзине). Этот поиск работает без ошибок при ручном вводе в командной строке, но не в пакетном режиме.

И с использованиемточно такой же код, чтобы проверить другие папки, он работает просто отлично.Помощь?

Код:

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 echo Recycle Bin: %%~ta
popd
)

1 Ответ

0 голосов
/ 11 декабря 2018

Причина, по которой это не работает в пакете, заключается в одной раздражающей функции операторов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...