Batch file 如何只执行文件夹中名称以两位数开头的所有SQL文件,而忽略所有其他SQL文件?
我有下面的批处理代码,它执行一个文件夹的所有SQL文件Batch file 如何只执行文件夹中名称以两位数开头的所有SQL文件,而忽略所有其他SQL文件?,batch-file,execute-sql-task,Batch File,Execute Sql Task,我有下面的批处理代码,它执行一个文件夹的所有SQL文件 for /r %%G in (*.sql) do sqlcmd /S localhost /d superDB /U sa /P topsecret -i"%%G" pause 但现在我只想执行名称中以两位数开头的文件,如: 01_file.sql 02_file.sql 05_file.sql 43_file.sql 但不是像这样的文件: optional_01_file.sql XYZ04_file.sql 有人能告诉我如何更改
for /r %%G in (*.sql) do sqlcmd /S localhost /d superDB /U sa /P topsecret -i"%%G"
pause
但现在我只想执行名称中以两位数开头的文件,如:
01_file.sql
02_file.sql
05_file.sql
43_file.sql
但不是像这样的文件:
optional_01_file.sql
XYZ04_file.sql
有人能告诉我如何更改代码,只过滤文件名以2位数字开头的文件吗?Findstr的基本正则表达式功能足以匹配文件。
未测试:
:: Q:\Test\2018\07\21\SO_51456661.cmd
@echo off
for /r %%G in (*.sql) do (
Echo=%%~nG|Findstr "^[0-9][0-9]_" 2>&1>Nul && (
echo sqlcmd /S localhost /d superDB /U sa /P topsecret -i"%%G"
)
)
在包含这些文件的文件夹中
> dir /B *.sql
01_file.sql
0815_file.sql
55_file.sql
abc0855_file.sql
我收到了这些命令(仅用于演示)
我建议此任务使用以下批处理文件:
@for /F "delims=" %%G in ('dir "%~dp0??_*.sql" /A-D-H /B /ON 2^>nul ^| %SystemRoot%\System32\findstr.exe /B /R "[0123456789][0123456789]"') do @sqlcmd.exe /S localhost /d superDB /U sa /P topsecret -i"%~dp0%%G"
此批处理文件要求以[0-9][0-9].
开头的*.sql文件存储在与批处理文件相同的目录中,并且运行批处理文件的当前目录可以是在未设置计划任务的在中启动选项的情况下将此批处理文件作为计划任务运行时有用的任何目录
要处理当前目录中的*.sql文件而不是批处理文件的目录,只需删除扩展到批处理文件的驱动器和路径的%~dp0
。扩展的批处理文件路径字符串始终以反斜杠结尾
%~dp0
也可以被以齿隙结尾的任何其他文件夹路径替换
带有所用选项的命令在一个单独的命令进程中运行,该命令进程从命令行后台的cmd/C
开始
dir "C:\Batch File Path\??_*.sql" /A-D-H /B /ON 2>nul | C:\Windows\System32\findstr.exe /B /R /C:[0123456789][0123456789]
命令DIR搜索
- 由于
(属性不是目录,也不是隐藏的),所以只有非隐藏文件/A-D-H
- 在批处理文件的目录中
- 对于与通配符模式匹配的文件
??*.sql
- 由于
(裸格式),只输出文件名+文件扩展名以处理标准输出/B
- 按名称的字母顺序排列,因为
/ON
cmd.exe
的内部命令,该命令已在运行,用于处理此批处理文件
DIR在未找到任何与写入处理STDERR的标准匹配的文件名时输出的错误消息(标准错误)将通过2>nul
重定向到设备nul,以抑制该错误
处理STDOUT的DIR的输出通过
重定向,以处理下一个命令FINDSTR的STDIN(标准输入),该命令是一个外部命令,这意味着默认情况下在Windows系统目录中提供一个控制台可执行文件
FINDSTR搜索从STDIN读取的行
- 因为
/B
- 与字符串匹配的
[0123456789][0123456789]
- 由于显式使用了
,因此被解释为正则表达式搜索字符串/R
[0123456789][0123456789]
而不是[0-9][0-9]
的原因,请参阅,因为[0-9]
也与使用代码页Windows-1252编码的三个字符匹配
FINDSTR输出与正则表达式匹配的所有行(=文件名),该正则表达式仅应用于后台命令处理的前两个字符
FOR捕获这些文件名并逐行处理delims=
为字符串拆分定义一个空列表,以便始终将文件的全名分配给循环变量G
,即使*.sql文件名包含一个或多个空格
另请阅读Microsoft关于的文章,了解有关|
和2>nul
的解释。重定向运算符
和|
必须使用插入符号^
对命令行进行转义,以便在Windows命令解释器处理此命令行时,在执行执行嵌入的dir
命令之前,将该命令行解释为文字字符与findstr
在一个单独的命令中的行在后台启动
最好是在将此批处理文件作为计划任务运行时,也使用完整路径指定sqlcmd.exe
,以使批处理文件独立于用于运行计划任务的环境(帐户)的环境变量path
如果文件夹中只有以两位数字和下划线开头的*.sql文件,或者文件夹及其所有子文件夹中的*.sql文件都应该使用sqlcmd
执行,这就有点不清楚了
下面是上述批处理文件命令行的一个变体,用于在整个文件夹树中以包含批处理文件的文件夹开始运行所有以[0-9][0-9]\ucode>开头的*.sql:
@for /F "delims=" %%G in ('dir "%~dp0??_*.sql" /A-D-H /B /ON /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /R /C:"\\[0123456789][0123456789]_[^\\]*$"') do @sqlcmd.exe /S localhost /d superDB /U sa /P topsecret -i"%%G"
命令DIR还与选项/S
一起使用,这将导致在子目录中搜索与通配符模式匹配的文件??*.sql
DIR的输出随着/S
的变化而变化,因为文件名现在以完整的文件路径输出
由于这个原因,FINDSTR没有/B
,正则表达式被修改为\[0123456789][0123456789]\[^\\]*$
,以便只输出文件名中以两位数字开头的*.sql文件,与文件路径无关
命令sqlcmd
仅与%%G
一起调用,因为循环变量保存当前SQL文件的完整限定文件名(=文件路径+文件名+文件扩展名)
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
@for /F "delims=" %%G in ('dir "%~dp0??_*.sql" /A-D-H /B /ON /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /R /C:"\\[0123456789][0123456789]_[^\\]*$"') do @sqlcmd.exe /S localhost /d superDB /U sa /P topsecret -i"%%G"