简体   繁体   中英

BATCH - Find string in text file and add a new string after that line

I'm trying to search a text file for a particular string from a bat file. If the string exist, add a new string after it on the next line. I can't seem to get the code below working correctly. Any Ideas?

This is the string i'm searching for in my text file. [/Script/MyGame.Mode]

Here's what the text file looks like.

[/Script/Config.Mode]
Something here 1
Something here 2

[/Script/MyGame.Mode]
Something here 1
Something here 2

[/Script/Edit.Mode]
Something here 1
Something here 2

And here's how I want it to look.

[/Script/Config.Mode]
Something here 1
Something here 2

[/Script/MyGame.Mode]
RedirectReferences=(PackageName="%Package%",PackageURLProtocol="%PackageURLProtocol%",PackageURL="%WebAddress%/%Package%%Ext%",PackageChecksum="")
Something here 1
Something here 2

[/Script/Edit.Mode]
Something here 1
Something here 2

Here's the code I have so far.

@echo off

:GETINFO
echo.
echo.
cls
echo.
echo Let's get some information for your config. 
echo Note: The information you enter below is case sensitive. You can copy and paste.
echo.
echo Here's a Package Name example: "DM-MyTest-WindowsNoEditor"
echo.
set /p Package=Enter Package Name:
echo.
echo.
echo.
echo The Package URL Protocol will be "http" or "https"
echo.
set /p PackageURLProtocol=Enter Package URL Protocol:
echo.
echo.
echo.
echo Here's a WebAddress example: "www.myredirect.com/test" (Don't add the trailing /)
set /p WebAddress=Enter Redirect(WebAddress)URL:
echo.
echo.
echo.
echo The file extention is usually ".pak"
echo.
set /p Ext=Enter Map File Extention:
echo.
cls
echo.
echo Please wait... Currently Creating Test References.

:SHOWLINE
echo.
set NewURL=RedirectReferences=(PackageName="%Package%",PackageURLProtocol="%PackageURLProtocol%",PackageURL="%WebAddress%/%Package%%Ext%",PackageChecksum=""^^)

pause

:WRITENEW
set inputfile=game.txt
set outputfile=game.temp.txt
(for /f usebackq^ delims^=^ eol^=  %%a in ("%inputfile%") do (
   if "%%~a"=="[/Script/MyGame.Mode]" call echo %NewURL%
   echo %%a 
))>>"%outputfile%"

echo.
pause
  1. When I run the posted code in Command Prompt console I see a syntax error:

    ) was unexpected at this time.

    Apparently the parentheses inside NewURL break things when expanded in the loop.

    • A straightforward solution would be to delay the expansion by using the call trick:

       call echo %%NewURL%%
    • Alternatively:

       setlocal enableDelayedExpansion & echo !NewURL! & endlocal
    • Or double-escape the closing parenthesis with ^^ (one time for set and another for an expanded value inside the loop):

       set NewURL=.............PackageChecksum=""^^)
  2. Another issue is that the output file name is the same as the input file name but it's impossible to redirect output into the same file as you're reading.

    Change the output name to a different file. Then replace the original after the loop is finished:

     set inputfile=game.txt set outputfile=game.temp.txt ................... ))>>"%outputfile%" move/y "%outputfile%" "%inputfile%"
  3. And to change the order of the new string to print it after the found line simply swap the two lines inside the inner loop:

     echo %%a if "%%~a"=="[/Script/MyGame.Mode]" call echo %%NewURL%%

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM