首页 文章

命令在命令行上运行,但在批处理文件中意外运行

提问于
浏览
0

我有这个简单的批处理代码来检查子文件夹上的修改日期(特别是回收站) . 当在命令提示符中手动输入而不是批处理时,此搜索可以完美地运行 .

并使用相同的确切代码来检查其他文件夹它工作得很好 . 救命?

码:

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 回答

  • 3

    这不是批量工作的原因是使用 SET 命令的 IF 语句的一个令人烦恼的功能 . 正如This Post所述 - “ cmd 在解析命令时扩展变量,而不是在它们运行时扩展变量 . 在这种情况下,带有块 ( ... ) (或实际上任何块)的 iffor 语句恰好是单个命令 . 所以当你在一个块中设置变量并尝试在同一个块中使用它们,不再有变量 - 它们被块甚至执行之前变量所具有的值所取代 . - Joey

    要解决这个问题,你可以简单地将你的代码块放在 IF 语句中,而是使用 ELSE 并让它 goto:EOF

    Option 1: - 避免 IF 语句W / H代码块

    @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 语句中使用块,则需要在脚本顶部使用 setlocal enabledelayedexpansion . 此外,要回显或读取括号,您必须使用 !{File}! 而不是 %{File}% .

    Option 2: - 正确扩展 IF 语句W / H代码块

    @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
    

相关问题