使用文件名中的空格和句点处理批处理文件

时间:2018-06-11 10:26:10

标签: batch-file filenames

我正在尝试将多个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

任何帮助表示赞赏。

提前致谢

2 个答案:

答案 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/