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

时间:2018-12-11 06:05:45

标签: batch-file cmd

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

并使用相同的确切代码检查其他文件夹,效果很好。帮助吗?

代码:

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 个答案:

答案 0 :(得分:3)

之所以不能批量运行,是因为IF命令使用了SET语句的一个令人讨厌的功能。如This Post所述-“ cmd在解析命令时而不是在运行时扩展变量。碰巧是iffor语句带有块{{ 1}}(或实际上是任何块)在这种情况下都作为单个命令进行计算,因此,当您在块内设置变量并尝试在同一块中使用它们时,就不再有变量了-它们被变量之前的值所取代该块甚至被执行了。” -Joey

要解决此问题,您不能简单地将代码块放在( ... )语句中,而不能使用IF并使其ELSEgoto

选项1:-避免使用:EOF语句 W / H 代码块

IF

但是,如果您确实希望在@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}!

选项2:-正确展开%{File}%语句 W / H 代码块

IF