我正在尝试将多个SQL脚本处理为单个文件。但是,我遇到了问题,因为我无法控制他们的命名。我还需要指定文件而不是从文件夹中处理它们。
以下示例代码。我无法处理带有句点和空格的文件。
SET destination=%cd%\Database.sql
SET ddlDirectory=%cd%\Test\
ECHO Destination file: %destination%
ECHO DDL directory: %ddlDirectory%
FOR /f "usebackq tokens=* delims=," %%f IN (
`%ddlDirectory%02. Create Schemas.sql`,
`%ddlDirectory%03. Create Tables.sql`)
) DO (
@ECHO. >> %destination%
@ECHO. >> %destination%
@ECHO --********************************************************************** >> %destination%
@ECHO -- Contents of file: %%f >> %destination%
@ECHO --********************************************************************** >> %destination%
TYPE %%f >> %destination%
)
pause
任何帮助表示赞赏。
提前致谢
答案 0 :(得分:0)
目前还不清楚是否应该先用type NUL >%destination%
清除destiantion。
SET destination=%cd%\Database.sql
SET ddlDirectory=%cd%\Test\
ECHO Destination file: %destination%
ECHO DDL directory: %ddlDirectory%
(FOR %%A IN (
"%ddlDirectory%02. Create Schemas.sql"
"%ddlDirectory%03. Create Tables.sql"
) DO (
@ECHO.
@ECHO.
@ECHO --**********************************************************************
@ECHO -- Contents of file: %%A
@ECHO --**********************************************************************
TYPE %%A
)
) >> %destination%
pause
答案 1 :(得分:0)
我建议执行此任务的批处理文件:
@echo off
if "%CD:~-1%" == "\" (
set "destination=%CD%Database.sql"
set "ddlDirectory=%CD%Test"
) else (
set "destination=%CD%\Database.sql"
set "ddlDirectory=%CD%\Test"
)
echo Destination file: "%destination%"
echo DDL directory: "%ddlDirectory%"
del "%destination%" 2>nul
set "FirstFile=yes"
for %%I in ("%ddlDirectory%\*.sql") do (
if not defined FirstFile (
echo/>>"%destination%"
echo/>>"%destination%"
) else set "FirstFile="
echo -- **********************************************************************>>"%destination%"
echo -- Contents of file: %%~fI>>"%destination%"
echo -- **********************************************************************>>"%destination%"
type "%%I" >>"%destination%"
)
pause
请注意,此处使用的 FOR 循环处理的* .sql文件的顺序取决于文件系统的文件命名顺序。在NTFS驱动程序上,文件名顺序是字母(或多或少),而在FAT32和exFAT驱动器上,文件名顺序取决于目录中的最后一次写访问。
同一个批处理文件,其中包含 FOR 循环中指定的文件名列表,而不是处理文件夹中的所有* .sql文件。
@echo off
if "%CD:~-1%" == "\" (
set "destination=%CD%Database.sql"
set "ddlDirectory=%CD%Test"
) else (
set "destination=%CD%\Database.sql"
set "ddlDirectory=%CD%\Test"
)
echo Destination file: "%destination%"
echo DDL directory: "%ddlDirectory%"
del "%destination%" 2>nul
set "FirstFile=yes"
for %%I in (
"02. Create Schemas.sql"
"03. Create Tables.sql"
) do (
if exist "%ddlDirectory%\%%~I" (
if not defined FirstFile (
echo/>>"%destination%"
echo/>>"%destination%"
) else set "FirstFile="
echo -- **********************************************************************>>"%destination%"
echo -- Contents of file: "%ddlDirectory%\%%~I">>"%destination%"
echo -- **********************************************************************>>"%destination%"
type "%ddlDirectory%\%%~I" >>"%destination%"
)
)
pause
在将文件名写入目标文本文件之前进行文件现有检查。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
cmd /?
... cmd.exe
是执行批处理文件的Windows命令处理器。在最后一个帮助页面上解释了包含空格或其中一个字符&()[]{}^=;!'+,`~
的文件名必须用双引号括起来。echo /?
for /?
if /?
pause /?
set /?
type /?
请注意,在重定向的 ECHO 命令行中,重定向操作符>>
留下的空间将作为尾随空格写入文本文件。
另见DosTips论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/