我的批处理文件有什么问题?跳过 SQL 命令后的所有内容

What is wrong with my batch file? Skips over everything after the SQL command

我正在尝试从数据库中提取文件夹名称,并使用此脚本循环进入目录中的那些特定文件夹,并删除存储在另一个 txt 文件中的某些文件名。由于某种原因,它运行 SQL 命令但它跳过所有内容并到达暂停。我正在尝试让自己熟悉这些命令和语法,所以可能只是另一双眼睛在看它时发现了一些不正常的东西。

sql 命令可以很好地创建 PicRemoverTemp.txt 文件,而 deletethese.txt 只包含几个 .txt 文件,脚本需要循环遍历从数据库中提取的文件夹名称并删除文件(如果存在)。

感谢您的帮助!

@ECHO OFF
REM Creates "deletethese.txt" via sql command
FOR /F "tokens=1 delims=," %%G IN (PicRemoverTEMP.txt) DO (
    SET "PathToCheck=P:\My Documents\Comm Trax Test\%%G"
    FOR /F "tokens=1 delims=," %%v IN (deletethese.txt) DO (
            REM Verify file exists before attempting to delete.
            IF EXIST "%PathToCheck%\%%v" (
                ECHO Deleting File %%v
                DEL "%PathToCheck%\%%v"
            )
    )
)
PAUSE

尝试

@ECHO OFF
REM Creates "deletethese.txt" via sql command
FOR /F "delims=," %%G IN (PicRemoverTEMP.txt) DO (
    FOR /F "delims=," %%v IN (deletethese.txt) DO (
            REM Verify file exists before attempting to delete.
            IF EXIST "P:\My Documents\Comm Trax Test\%%~G\%%~v" (
                ECHO Deleting File %%v
                DEL "P:\My Documents\Comm Trax Test\%%~G\%%~v"
            )
    )
)
PAUSE

您不能在没有 delayed expansion 的情况下在代码块内使用变量。 http://ss64.com/nt/delayedexpansion.html

在批处理文件中,首先解析并执行每一行或每一行块(括号中的行)。在解析阶段,在 和 line/block 开始执行之前,所有变量读取都被替换为变量 中的值。如果一个变量在 line/block 中改变了它的值,这个改变的值是不可访问的,因为读取操作被删除,取而代之的是初始值。

在你的情况下,这意味着在这段代码中

FOR /F "tokens=1 delims=," %%G IN (PicRemoverTEMP.txt) DO (
    SET "PathToCheck=P:\My Documents\Comm Trax Test\%%G"
    FOR /F "tokens=1 delims=," %%v IN (deletethese.txt) DO (
            IF EXIST "%PathToCheck%\%%v" (
....

变量 PathToCheck 在一个块内被更改,但是由于所有读取操作(值检索)都被删除,IF EXIST "%PathToCheck%... 将找不到指定的文件作为正在使用的值不是正确的。

要解决这个问题,您可以使用延迟扩展 (setlocal enabledelayedexpansion),这将允许您在需要时更改将变量从 %var% 读取到 !var! 的语法,表明解析器必须将读取操作延迟到执行命令的那一刻。

setlocal enabledelayedexpansion

FOR /F "tokens=1 delims=," %%G IN (PicRemoverTEMP.txt) DO (
    SET "PathToCheck=P:\My Documents\Comm Trax Test\%%G"
    FOR /F "tokens=1 delims=," %%v IN (deletethese.txt) DO (
            IF EXIST "!PathToCheck!\%%v" (
                ECHO Deleting File %%v
                DEL "!PathToCheck!\%%v"
            )
    )
)

或者,您可以将代码更改为

FOR /F "tokens=1 delims=," %%G IN (PicRemoverTEMP.txt) DO (
    FOR /F "tokens=1 delims=," %%v IN (deletethese.txt) DO (
            IF EXIST "P:\My Documents\Comm Trax Test\%%G\%%v" (
                ECHO Deleting File %%v
                DEL "P:\My Documents\Comm Trax Test\%%G\%%v"
            )
    )
)

set "PathToCheck=P:\My Documents\Comm Trax Test"

FOR /F "tokens=1 delims=," %%G IN (PicRemoverTEMP.txt) DO (
    FOR /F "tokens=1 delims=," %%v IN (deletethese.txt) DO (
            IF EXIST "%PathToChange%\%%G\%%v" (
                ECHO Deleting File %%v
                DEL "%PathToChange%\%%G\%%v"
            )
    )
)

在这两种情况下,由于没有变量在块内更改和读取,因此不需要延迟扩展