Пакетная обработка файлов с пробелами и точками в имени файла - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь обработать несколько сценариев 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 голосов
/ 11 июня 2018

Я предлагаю следующий пакетный файл для этой задачи:

@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

Обратите внимание, что порядок файлов * .sql, обрабатываемых циклом FOR , как здесь используется, зависит от именования файловпорядок файловой системы.В драйверах 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.Не в состоянии дать текст или пустую строку - вместо этого используйте ECHO /

0 голосов
/ 11 июня 2018

Не совсем понятно, следует ли очищать начальное значение с помощью 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
...