使用批处理文件检查具有特定扩展名的文件是否在特定文件夹中

时间:2018-05-31 19:33:45

标签: batch-file

在批处理文件中,我需要从用户获取路径,如果它们包含它,则删除尾部反斜杠,然后检查具有.sql扩展名的任何文件是否在他们指定的文件夹中。如果没有,我想将它们返回到变量输入部分。

这就是我所拥有的:

REM Get the folder paths from the user
:setfolderpaths
set /p SCRIPTFOLDER="D:\Mark\Centriq Extraction Projects\"
set /p OUTPUTFOLDER="D:\Mark\Centriq Extraction Projects\"

REM View what the user entered (testing only)
echo %SCRIPTFOLDER%
echo %OUTPUTFOLDER%

REM pause here to check the user entry (testing only)
@pause

REM Remove trailing slashes from the folder path if they exist
if %SCRIPTFOLDER:~-1%==\ set SCRIPTFOLDER=%SCRIPTFOLDER:~0,-1%
if %OUTPUTFOLDER:~-1%==\ set OUTPUTFOLDER=%OUTPUTFOLDER:~0,-1%

REM If the folder the user entered doesn't exist, go back to the folder entry section
if not exist %SCRIPTFOLDER% + "\*.sql" (
    goto setfolderpaths
)

但是,当我运行该文件时,在按下一个键继续暂停后,cmd窗口立即关闭。我已经检查了删除反斜杠的行,所以问题似乎出现在if not exist检查中。

修改 显然,我的样本中有一些代码令我感到困惑。我添加了评论来解释我在每个部分做的事情。我只需要找出为什么我在用户指定的文件夹中检查.sql文件不起作用。

更新

好的,我根据@LotPings的建议清理了我的引用问题。

所以,当我在if检查之前放置一个回声:

echo %SCRIPTFOLDER%
@pause

这显示了一条有效的路径,我知道确实包含sql文件。所以这段代码不起作用:

if not exist "%SCRIPTFOLDER%\*.sql" (
    goto setfolderpaths
)

当我按一下键继续暂停时,cmd窗口关闭。

2 个答案:

答案 0 :(得分:0)

这都是引用问题。

如果双引号是最后一个字符(如上所述),则将其删除,
该字符串只有一个前导d'引用,仍然是一个尾随反斜杠。

更好的引用总是这样:

:setfolderpaths
set "SCRIPTFOLDER=D:\Mark\Centriq Extraction Projects\"
set "OUTPUTFOLDER=D:\Mark\Centriq Extraction Projects\"

echo %SCRIPTFOLDER%
echo %OUTPUTFOLDER%

@pause

REM Remove trailing slashes from the folder path if they exist
if "%SCRIPTFOLDER:~-1%"=="\" set "SCRIPTFOLDER=%SCRIPTFOLDER:~0,-1%"
if "%OUTPUTFOLDER:~-1%"=="\" set "OUTPUTFOLDER=%OUTPUTFOLDER:~0,-1%"

if not exist "%SCRIPTFOLDER%\*.sql" (
    goto setfolderpaths
)

此外,您在if。

中使用的+没有字符串连接

答案 1 :(得分:0)

阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line?上的答案,您知道前两个 SET 命令行出了什么问题。

原始问题:文件夹路径使用双引号分配给环境变量,因此两个环境变量值的最后一个字符都是",而不是您预期的反斜杠

已修改的问题:两个文件夹路径显示为提示文字。

SET 命令行中第一个"的错误位置导致其余行的语法错误以及 IF 条件下的+线。 Windows命令处理器不支持使用运算符+的字符串连接。要连接的字符串必须只是在批处理文件中连接写入。

这是一个批处理文件,提示用户输入两个路径并运行一些检查,因为用户可以自由输入任何内容或字符串,如果没有使用正确的序列进行适当的检查而不使用延迟的环境变量扩展,这可能会造成非常糟糕的事情。在执行每个%ScriptFolder%%OutputFolder%引用之前,Windows命令处理器会修改命令行。在批处理文件中编写什么并不重要。在执行批处理脚本时,Windows命令处理器cmd.exe解析后,每个命令行或整个命令块的外观都很重要。

@echo off

:GetScriptFolderPath
set "ScriptFolder="
set /P "ScriptFolder=Enter script folder path: "

rem Has the user not entered any string?
if not defined ScriptFolder goto GetScriptFolderPath

rem Remove all double quotes from entered string.
set "ScriptFolder=%ScriptFolder:"=%"

rem Has the user entered a string consisting only of double quotes?
if not defined ScriptFolder goto GetScriptFolderPath

rem Remove a backslash at end of user entered string.
if "%ScriptFolder:~-1%" == "\" set "ScriptFolder=%ScriptFolder:~0,-1%"

rem Has the user entered just a backslash (with one or more double quotes)?
if not defined ScriptFolder goto GetScriptFolderPath

rem Is the user entered string really a path to a directory
rem which really exists and contains at least one *.sql file?
if not exist "%ScriptFolder%\*.sql" goto GetScriptFolderPath

:GetOutputFolderPath
set "OutputFolder="
set /P "OutputFolder=Enter output folder path: "
if not defined OutputFolder goto GetOutputFolderPath
set "OutputFolder=%OutputFolder:"=%"
if not defined OutputFolder goto GetOutputFolderPath
if "%OutputFolder:~-1%" == "\" set "OutputFolder=%OutputFolder:~0,-1%"
if not defined OutputFolder goto GetOutputFolderPath

rem Is the user entered string really a path to an existing directory?
if not exist "%OutputFolder%\" goto GetOutputFolderPath

注意:批处理文件用户也可以拖放将文件夹路径(例如从Windows资源管理器)拖放到控制台窗口以输入路径,只需按下 RETURN ENTER 即可完成输入提示。

还可以使用set "ScriptFolder=D:\Mark\Centriq Extraction Project"代替set "ScriptFolder="来定义非空默认值,用户只需按 RETURN ENTER < / kbd>使用它。还可以为输出文件夹设置默认文件夹路径。