文件名中包含空格和句点的批处理文件

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/