Не понимаю код возврата из команды forfiles, встроенной в for - PullRequest
1 голос
/ 22 марта 2011

Я пытаюсь прокрутить список пользователей (office_id_list_%YY_MM_DD%\%%), который у меня есть для каждого офиса (office_list.txt), и создать файл, когда найдены файлы с более новой датой (%3). Приведенный ниже код не работал, поэтому я решил отобразить уровень ошибки и обнаружил, что он всегда -1073741510 (работает на компьютере с Windows 2003). В конечном итоге я пытаюсь определить домашние каталоги пользователей (организованные по офисам), которые не были изменены с определенной даты. Любые мысли будут с благодарностью.


for /f "tokens=1 delims= " %%i in (U:\sysmon\u_cleanup\office_list.txt) do (
  if not exist u:\sysmon\u_cleanup\results\%%i mkdir u:\sysmon\u_cleanup\results\%%i
  for /f "tokens=1 delims= " %%j in (U:\sysmon\u_cleanup\results\office_lists_%YY_MM_DD%\%%i_dir_list_%YY_MM_DD%_final.txt) do (
    forfiles /P %1%%i\%%j /S /D +%3 /C "cmd /c if %errorlevel% == 0 echo ** Do not Archive - Found files modified after %3 > U:\sysmon\u_cleanup\results\%%i\%%j_%YY_MM_DD%.txt"
  )
)

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Добавьте параметр /V:on к cmd и используйте !errorlevel! вместо %errorlevel%, что включает замедленное расширение.

0 голосов
/ 23 марта 2011

Вероятно, главная проблема - это часть cmd /c if %errorlevel% == 0, она расширяет уровень ошибки до того, как любая из ваших команд будет выполнена.

Обычно задержка расширения - выбор, но здесь он не работает (или, как упоминал Джои, с / V: on), потому что он находится в новом контексте cmd.

Здесь вы можете использовать его таким образом cmd /c if %%errorlevel%% == 0, поэтому, если полный блок анализируется в первый раз, деталь расширяется до cmd /c if %errorlevel% == 0, и это расширяется во второй раз, когда выполняется cmd /c.

И вы могли бы немного украсить код

set "officePath=U:\sysmon\u_cleanup"
set "officeDatePath=%officePath%\results\office_lists_%YY_MM_DD%"
for /f "tokens=1 delims= " %%i in ("%officePath%\office_list.txt") do (
    if not exist "%officePath%\results\%%i" (
        mkdir "%officePath%\results\%%i"
    )
    for /f "tokens=1 delims= " %%j in ("%officeDatePath%\%%i_dir_list_%YY_MM_DD%_final.txt") do (
        forfiles /P %1%%i\%%j /S /D +%3 /C "cmd /c if %%errorlevel%% == 0 echo ** Do not Archive - Found files modified after %3 > %officePath%\results\%%i\%%j_%YY_MM_DD%.txt"
    )
)
...