Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Don';无法理解for中嵌入的forfiles命令的返回代码_Windows_Batch File_Cmd_Windows Server 2003 - Fatal编程技术网

Windows Don';无法理解for中嵌入的forfiles命令的返回代码

Windows Don';无法理解for中嵌入的forfiles命令的返回代码,windows,batch-file,cmd,windows-server-2003,Windows,Batch File,Cmd,Windows Server 2003,我正在尝试循环浏览每个办公室的用户列表(office\u id\u list\%YY\u MM\u DD%\%%),并在找到比日期(%3)更新的文件时创建一个文件。下面的代码不起作用,所以我决定回显errorlevel,发现它总是-1073741510(在Windows 2003机器上工作)。最后,我试图识别自给定日期以来未被修改的用户主目录(由office组织)。 任何想法都将不胜感激 可能主要的问题是部分cmd/c如果%errorlevel%==0,它会在执行任何命令之前扩展errorle

我正在尝试循环浏览每个办公室的用户列表(
office\u id\u list\%YY\u MM\u DD%\%%
),并在找到比日期(
%3
)更新的文件时创建一个文件。下面的代码不起作用,所以我决定回显errorlevel,发现它总是
-1073741510
(在Windows 2003机器上工作)。最后,我试图识别自给定日期以来未被修改的用户主目录(由office组织)。 任何想法都将不胜感激



可能主要的问题是部分
cmd/c如果%errorlevel%==0
,它会在执行任何命令之前扩展errorlevel

通常选择延迟扩展,但在这里它不起作用(或者像Joey提到的那样,使用/V:on),因为它在一个新的cmd上下文中

在这里,如果%%errorlevel%%==0,您可以这样使用
cmd/c,因此如果第一次解析完整的块,如果%errorlevel%%==0
,则该部分将扩展为
cmd/c,并且在执行
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"
    )
)

可能主要的问题是部分
cmd/c如果%errorlevel%==0
,它会在执行任何命令之前扩展errorlevel

通常选择延迟扩展,但在这里它不起作用(或者像Joey提到的那样,使用/V:on),因为它在一个新的cmd上下文中

在这里,如果%%errorlevel%%==0
,您可以这样使用
cmd/c,因此如果第一次解析完整的块,如果%errorlevel%%==0
,则该部分将扩展为
cmd/c,并且在执行
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"
    )
)

/V:on
选项添加到
cmd
并使用
!错误等级
而不是启用延迟扩展的
%errorlevel%

/V:on
选项添加到
cmd
并使用
!错误等级
而不是启用延迟扩展的
%errorlevel%

谢谢。同样有效。感谢代码美化提示。如果可能的话,我确实喜欢简化流程,但当我尝试时,似乎会引入更多的问题。关于延迟扩展或dos如何解释变量(可能是加载时和运行时讨论),您有什么好的参考资料吗。不管怎样,谢谢。@jim:对于初学者和专家,对于理解批处理是如何工作的(专家)谢谢。同样有效。感谢代码美化提示。如果可能的话,我确实喜欢简化流程,但当我尝试时,似乎会引入更多的问题。关于延迟扩展或dos如何解释变量(可能是加载时和运行时讨论),您有什么好的参考资料吗。不管怎样,非常感谢。@jim:对于初学者和专家,对于理解批处理是如何工作的(专家)