我正在尝试遍历每个办公室(office_list.txt)的用户列表(office_id_list_%YY_MM_DD%\%%
),并在找到日期(%3
)的新文件时创建一个文件。下面的代码没有工作,所以我决定回应errorlevel,发现它始终是-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"
)
)
将/V:on
选项添加到cmd
并使用!errorlevel!
而不是%errorlevel%
来启用延迟扩展。
可能主要问题是部分cmd /c if %errorlevel% == 0
,它会在执行任何命令之前扩展错误级别。
通常延迟扩展是选择,但在这里它不起作用(或者像Joey所提到的那样,使用/ 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"
)
)