文件名中包含空格和句点的批处理文件
Batch file processing with spaces and periods in a filename
我正在尝试将多个 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
感谢任何帮助。
提前致谢
目前尚不清楚是否应该使用 type NUL >%destination%
清除目标。
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
我建议针对此任务使用以下批处理文件:
@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
在将文件名写入目标文本文件之前进行文件存在检查。
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
cmd /?
... cmd.exe
是执行批处理文件的 Windows 命令处理器。在上一个帮助页面上解释说,带有 space 或其中一个字符 &()[]{}^=;!'+,`~
的文件名必须用双引号引起来。
echo /?
for /?
if /?
pause /?
set /?
type /?
请注意,在重定向的 ECHO 命令行上留给重定向运算符 >>
的 space 被写为尾随 space 到文本中文件。
另请参阅 DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/
我正在尝试将多个 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
感谢任何帮助。
提前致谢
目前尚不清楚是否应该使用 type NUL >%destination%
清除目标。
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
我建议针对此任务使用以下批处理文件:
@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
在将文件名写入目标文本文件之前进行文件存在检查。
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
cmd /?
...cmd.exe
是执行批处理文件的 Windows 命令处理器。在上一个帮助页面上解释说,带有 space 或其中一个字符&()[]{}^=;!'+,`~
的文件名必须用双引号引起来。echo /?
for /?
if /?
pause /?
set /?
type /?
请注意,在重定向的 ECHO 命令行上留给重定向运算符 >>
的 space 被写为尾随 space 到文本中文件。
另请参阅 DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/