Вставить новые строки (в которых есть команда) после определенной строки в командном файле с помощью командного файла - PullRequest
0 голосов
/ 22 февраля 2012

Я хочу вставить строку, содержащую команду (mkdir / copy), в пакетный файл после определенной строки, использующей пакетный файл (команду mkdir / copy следует рассматривать как слово, а не как команду)
Входной сигнал:

set MTBBankpath = C: \ InstallerOutput \ QuickBooks-Sync \ MTB
copy / Y% QBprovisionpath% \ x86 \ Debug% ConnectorExecutionPath% \ x86 \ Debug

Выход:

set MTBBankpath = C: \ InstallerOutput \ QuickBooks-Sync \ MTB
copy / Y% ConnectorExecutionPath% \% outqbsyncpath%
mkdir / Y% ConnectorExecutionPath% \% outqbsyncpath%
copy / Y% QBprovisionpath% \ x86 \ Debug% ConnectorExecutionPath% \ x86 \ Debug

Новая строка copy / Y% ConnectorExecutionPath% \% outqbsyncpath% - с командой копирования и mkdir / Y% ConnectorExecutionPath% \% outqbsyncpath% с командой mkdir, вставляется после определенной строки set MTBBankpath = C: \ InstallerOutput \ QuickBooks-Sync \ MTB

SETLOCAL ENABLEDELAYEDEXPANSION

set inputFile =% userprofile% \ desktop \ testSO.bat
set outputFile =% userprofile% \ desktop \ testSOout.bat
set _strInsert = set IndbBankpath = C: \ InstallerOutput \ QuickBooks-Sync \ indb
set _strFind = set MTBBankpath = C: \ InstallerOutput \ QuickBooks-Sync \ MTB
установите I = 0

FOR / F "маркеры usebackq = 1 delims = []" %% A IN (FIND /N "%_strFind%" "%inputFile%") DO (set _strNum = %% A)
FOR / F "usebackq delims =" %% A IN ("% inputFile%") DO (
set / a i =! i! +1
ECHO %% A >> "% outputFile%"
IF [! I!] == [% _strNum%] (
ECHO% _strInsert% >> "% outputFile%"
ЭХО, Я ХОЧУ ДОБАВИТЬ ЭТУ ЛИНИЮ ТАКЖЕ ЭЧО ОООО ЭТОТ ЛИНИ ТОО >> "% outputFile%"
ECHO ZOMGBBQSAUCE ДОБАВИТЬ ЭТУ ЛИНИЮ ТАКЖЕ >> "% outputFile%"
)
)

Приведенный выше код не работает, если я изменяю
set _strInsert = copy / Y% ConnectorExecutionPath% \% outqbsyncpath% или
set _strInsert = mkdir% ConnectorExecutionPath % \% outqbsyncpath%

Пожалуйста, предложите решение для этого.

Ответы [ 2 ]

1 голос
/ 22 февраля 2012
@echo off
set "particularLine=set MTBBankpath=C:\InstallerOutput\QuickBooks-Sync\MTB"
setlocal DisableDelayedExpansion
if exist output.bat del output.bat
for /F "delims=" %%a in (input.bat) do (
   echo %%a
   set "line=%%a"
   setlocal EnableDelayedExpansion
   if "!line!" == "!particularLine!" (
      echo copy /Y %%ConnectorExecutionPath%%\%%outqbsyncpath%%
      echo mkdir /Y %%ConnectorExecutionPath%%\%%outqbsyncpath%%
   )
   endlocal
) >> output.bat

Предыдущий пакетный файл имеет несколько недостатков: он удаляет пустые строки и может завершиться ошибкой, если строка содержит кавычки.

РЕДАКТИРОВАТЬ : Добавлена ​​новая версия

Пакетный файл ниже работает быстрее, если входной файл большой; в нем также исправлено несколько деталей, например, не удаляются пустые строки.

@echo off
setlocal EnableDelayedExpansion
set "inputFile=%userprofile%\desktop\testSO.bat"
set "outputFile=%userprofile%\desktop\testSOout.bat"
set "particularLine=set MTBBankpath=C:\InstallerOutput\QuickBooks-Sync\MTB"
for /F "usebackq delims=:" %%a in (`findstr /N /C:"!particularLine!" "%inputFile%"`) do set theLine=%%a
if exist "%outputFile%" del "%outputFile%"
if not defined theLine echo The particular line doesn't exist in Input file & exit /B
setlocal DisableDelayedExpansion
set i=0
for /F "usebackq delims=" %%a in (`findstr /N "^" "%inputFile%"`) do (
   set "line=%%a"
   set /A i+=1
   setlocal EnableDelayedExpansion
   echo(!line:*:=!
   if !i! eql %theLine% goto exitLoop
   endlocal
) >> "%outputFile%"
:exitLoop
rem Insert here all the lines to insert, each one preceeded by ECHO
(
   echo copy /Y "%%ConnectorExecutionPath%%\%%outqbsyncpath%%"
   echo mkdir /Y "%%ConnectorExecutionPath%%\%%outqbsyncpath%%"
) >> "%outputFile%"
setlocal DisableDelayedExpansion
for /F "skip=%theLine% usebackq delims=" %%a in (`findstr /N "^" "%inputFile%"`) do (
   set "line=%%a"
   setlocal EnableDelayedExpansion
   echo(!line:*:=!
   endlocal
) >> "%outputFile%"

Обратите внимание, что вы должны удвоить знак процента в командах для вставки; в противном случае вставляется текущее значение переменных вместо% name% переменных.

0 голосов
/ 22 февраля 2012

Я считаю, что единственная проблема, с которой вы сталкиваетесь, заключается в том, что вы не инкапсулируете свои пути для команд COPY и MKDIR:

set _strInsert=mkdir %ConnectorExecutionPath%\%outqbsyncpath%

Попробуйте:

set _strInsert=mkdir "%ConnectorExecutionPath%\%outqbsyncpath%"

Я бы также проверил папку перед ее созданием.

РЕДАКТИРОВАТЬ:

Теперь, если вы 'Вы добавляете в кучу разных строк, просто добавьте их в код.В своем предыдущем посте вы просили добавить одну строку в код.Если вы делаете несколько строк, просто вставьте их прямо в выходной файл.

SETLOCAL ENABLEDELAYEDEXPANSION

set inputFile=%userprofile%\desktop\testSO.bat
set outputFile=%userprofile%\desktop\testSOout.bat
set _strFind=set MTBBankpath=C:\InstallerOutput\QuickBooks-Sync\MTB
set i=0

FOR /F "usebackq tokens=1 delims=[]" %%A IN (FIND /N "%_strFind%" "%inputFile%") DO (set _strNum=%%A)
FOR /F "usebackq delims=" %%A IN ("%inputFile%") DO (
    set /a i = !i! + 1
    ECHO %%A>>"%outputFile%"
    IF [!i!] == [%_strNum%] (
        ECHO set IndbBankpath=C:\InstallerOutput\QuickBooks-Sync\indb
        ECHO copy /Y "%ConnectorExecutionPath%\%outqbsyncpath%"
        ECHO mkdir /Y "%ConnectorExecutionPath%\%outqbsyncpath%"
        ECHO copy /Y "%QBprovisionpath%\x86\Debug %ConnectorExecutionPath%\x86\Debug"
    )>>"%outputFile%"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...