首页 文章

使用批处理文件在批处理文件中的特定行之后插入新行(具有命令)

提问于
浏览
-1

我想在使用批处理文件的特定行之后插入一个在批处理文件中有命令(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 \调试

新行 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 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 / ai =!i!1 ECHO %% A >>“%outputFile%”IF [!i!] == [%_strNum%](ECHO%_strInsert%>>“%outputFile%”ECHO我想添加此行>>“%outputFile%”ECHO OOOO此LiNE TOO >>“%outputFile%”ECHO ZOMGBBQSAUCE添加此项行也是>>“%outputFile%”))

如果我改变,上面的代码不起作用
set _strInsert=copy /Y %ConnectorExecutionPath%%outqbsyncpath%
set _strInsert=mkdir %ConnectorExecutionPath%%outqbsyncpath%

请为此建议一个解决方案 .

2 回答

  • 1

    我相信你唯一的问题是're running into is the fact that you'没有封装 COPYMKDIR 命令的路径:

    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%"
    )
    
  • 0
    @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
    

    以前的批处理文件有几个缺点:它删除空行,如果行包含引号可能会失败 .

    EDIT :新版本已添加

    如果输入文件很大,下面的批处理文件运行得更快;它还修复了一些细节,比如不删除空行 .

    @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% .

相关问题