不理解嵌入在for中的forfiles命令的返回码

问题描述 投票:1回答:2

我正在尝试遍历每个办公室(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"
  )
)
windows batch-file cmd windows-server-2003
2个回答
1
投票

/V:on选项添加到cmd并使用!errorlevel!而不是%errorlevel%来启用延迟扩展。


0
投票

可能主要问题是部分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"
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.