我正在尝试从数据库中提取文件夹名称,并使用此脚本循环到目录中的那些特定文件夹,并删除存储在另一个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
答案 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