0

我有一个非常奇怪的错误。我编写了一个脚本,将一些文件复制并提取到一个文件夹中,但在此之前,我删除了 dir / old 文件,如下所示:

SET destinationFolder=C:\MyFolder

IF EXIST %destinationFolder% ( 
        ECHO rd %destinationFolder% /S /Q
        rd %destinationFolder% /S /Q
        IF %errorlevel% == 0 ( ECHO --^> SUCCEED ) ELSE ( ECHO --^> FAILED & set /a errorCount+=1 & ECHO %errorlevel% )
) ELSE ( ECHO --^> SUCCEED: No files existent )

好吧,到目前为止,当我以管理员身份操作时,这有效,但当我不是管理员时,这不是预期的。

如果我打开一个非管理员 shell 并第一次运行批处理(不存在文件),它工作正常,当我在同一个 shell 重复它时(存在同一个批处理的文件)。

但是,如果我打开另一个/新的非管理员外壳(前一个不再运行)并且我运行脚本(来自另一批次的旧文件存在)它返回错误级别 2,即使我首先检查目录是否存在.

而“最有趣”的事情是,当我rd %destinationFolder% /S /Q在同一个 shell 中运行命令时,它在批处理中不起作用,它应该可以正常工作!

4

2 回答 2

0

您可以使用错误级别的值而不是变量

SET destinationFolder=C:\MyFolder

IF EXIST %destinationFolder% ( 
        ECHO rd %destinationFolder% /S /Q
        rd %destinationFolder% /S /Q || rem
        IF errorlevel 1 ( 
            ECHO --^> FAILED & set /a errorCount+=1 & ECHO %errorlevel% 
        ) ELSE ( 
            ECHO --^> SUCCEED 
        )
) ELSE ( 
    ECHO --^> SUCCEED: No files existent 
)

如果您更喜欢使用该变量,请避免等号前后的空格,并确保 %errorlevel% 变量没有值。如果它被显式设置(有时我已经看到它“初始化”为 0),来自命令的错误值将不会分配给它。

SET destinationFolder=C:\MyFolder

SET errorlevel=
IF EXIST %destinationFolder% ( 
        ECHO rd %destinationFolder% /S /Q
        rd %destinationFolder% /S /Q || rem
        IF not %errorlevel%==0 ( 
            ECHO --^> FAILED & set /a errorCount+=1 & ECHO %errorlevel% 
        ) ELSE ( 
            ECHO --^> SUCCEED 
        )
) ELSE ( 
    ECHO --^> SUCCEED: No files existent 
)

编辑:

在这两个示例中,需要将 rd 的输出链接到另一个命令以在执行失败时执行。没有它,rd 不会返回错误代码。

于 2013-10-22T08:12:06.993 回答
0

更改此代码

SET destinationFolder=C:\MyFolder
....
    rd %destinationFolder% /S /Q
    IF %errorlevel% == 0 (....

对此:

SET "destinationFolder=C:\MyFolder\"
....
    rd "%destinationFolder%" /S /Q || rem
    IF %errorlevel%==0 (....
于 2013-10-22T09:15:37.980 回答