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

时间:2015-01-14 17:53:45

标签: batch-file

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

sql命令创建PicRemoverTemp.txt文件就好了,deletethese.txt只保存了几个.txt文件,脚本需要循环遍历从DB中提取的文件夹名称并删除文件(如果存在)。 p>

感谢您的帮助!

@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

2 个答案:

答案 0 :(得分:2)

在批处理文件中,首先解析每行或每一行(括号中的行)并执行。在解析阶段,所有变量读取都将替换为变量中的值,然后行/块开始执行。如果变量在行/块内更改其值,则无法访问此更改的值,因为删除了读取操作,并替换为初始值。

在您的情况下,这意味着在此代码中

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"
            )
    )
)

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

答案 1 :(得分:1)

@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