Escaping exclamation marks with delayed expansion












1














I have a batch file I'm using to search for a piece of text and replace it with another. It works, but what's happening is that when the 'new' file is created, anything after an exclamation mark is deleted.



So original file



Hello! I have some cheese


Just becomes



Hello


Although the text I am trying to replace is fine.



I understand that since I'm using delayed expansion I need to somehow escape the exclamation marks with ^^! but can't figure out where to do this. Adding it at the echo just echoes the ^^! literally.



Any help would be appreciated.



set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"


set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed%SOURCE%"


setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%

endlocal









share|improve this question




















  • 1




    there's neither enableDelayedExpansion nor for /f in DOS. The Windows cmd is not DOS
    – phuclv
    Nov 12 '18 at 14:44










  • Apologies. I'm not a coder or programmer and so I get things confused sometimes.
    – SwagBag
    Nov 12 '18 at 15:05
















1














I have a batch file I'm using to search for a piece of text and replace it with another. It works, but what's happening is that when the 'new' file is created, anything after an exclamation mark is deleted.



So original file



Hello! I have some cheese


Just becomes



Hello


Although the text I am trying to replace is fine.



I understand that since I'm using delayed expansion I need to somehow escape the exclamation marks with ^^! but can't figure out where to do this. Adding it at the echo just echoes the ^^! literally.



Any help would be appreciated.



set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"


set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed%SOURCE%"


setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%

endlocal









share|improve this question




















  • 1




    there's neither enableDelayedExpansion nor for /f in DOS. The Windows cmd is not DOS
    – phuclv
    Nov 12 '18 at 14:44










  • Apologies. I'm not a coder or programmer and so I get things confused sometimes.
    – SwagBag
    Nov 12 '18 at 15:05














1












1








1







I have a batch file I'm using to search for a piece of text and replace it with another. It works, but what's happening is that when the 'new' file is created, anything after an exclamation mark is deleted.



So original file



Hello! I have some cheese


Just becomes



Hello


Although the text I am trying to replace is fine.



I understand that since I'm using delayed expansion I need to somehow escape the exclamation marks with ^^! but can't figure out where to do this. Adding it at the echo just echoes the ^^! literally.



Any help would be appreciated.



set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"


set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed%SOURCE%"


setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%

endlocal









share|improve this question















I have a batch file I'm using to search for a piece of text and replace it with another. It works, but what's happening is that when the 'new' file is created, anything after an exclamation mark is deleted.



So original file



Hello! I have some cheese


Just becomes



Hello


Although the text I am trying to replace is fine.



I understand that since I'm using delayed expansion I need to somehow escape the exclamation marks with ^^! but can't figure out where to do this. Adding it at the echo just echoes the ^^! literally.



Any help would be appreciated.



set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"


set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed%SOURCE%"


setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%

endlocal






batch-file cmd findstr






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 12 '18 at 14:45









phuclv

14.4k851212




14.4k851212










asked Nov 12 '18 at 14:23









SwagBag

82




82








  • 1




    there's neither enableDelayedExpansion nor for /f in DOS. The Windows cmd is not DOS
    – phuclv
    Nov 12 '18 at 14:44










  • Apologies. I'm not a coder or programmer and so I get things confused sometimes.
    – SwagBag
    Nov 12 '18 at 15:05














  • 1




    there's neither enableDelayedExpansion nor for /f in DOS. The Windows cmd is not DOS
    – phuclv
    Nov 12 '18 at 14:44










  • Apologies. I'm not a coder or programmer and so I get things confused sometimes.
    – SwagBag
    Nov 12 '18 at 15:05








1




1




there's neither enableDelayedExpansion nor for /f in DOS. The Windows cmd is not DOS
– phuclv
Nov 12 '18 at 14:44




there's neither enableDelayedExpansion nor for /f in DOS. The Windows cmd is not DOS
– phuclv
Nov 12 '18 at 14:44












Apologies. I'm not a coder or programmer and so I get things confused sometimes.
– SwagBag
Nov 12 '18 at 15:05




Apologies. I'm not a coder or programmer and so I get things confused sometimes.
– SwagBag
Nov 12 '18 at 15:05












1 Answer
1






active

oldest

votes


















2
















To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:



@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"

set "source=%rootname%_unqiue_suffix.txt"
set "target=Fixed%source%"

(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
set "line=%%b"
setlocal EnableDelayedExpansion
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
endlocal
)
) > "%target%"

endlocal


This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53264174%2fescaping-exclamation-marks-with-delayed-expansion%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    2
















    To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:



    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    set "rootname=Common Filename"

    set "replace="old">"
    set "replaced="new">"

    set "source=%rootname%_unqiue_suffix.txt"
    set "target=Fixed%source%"

    (
    for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
    set "line=%%b"
    setlocal EnableDelayedExpansion
    if defined line set "line=!line:%replace%=%replaced%!"
    echo(!line!
    endlocal
    )
    ) > "%target%"

    endlocal


    This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.






    share|improve this answer




























      2
















      To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:



      @echo off
      setlocal EnableExtensions DisableDelayedExpansion
      set "rootname=Common Filename"

      set "replace="old">"
      set "replaced="new">"

      set "source=%rootname%_unqiue_suffix.txt"
      set "target=Fixed%source%"

      (
      for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
      set "line=%%b"
      setlocal EnableDelayedExpansion
      if defined line set "line=!line:%replace%=%replaced%!"
      echo(!line!
      endlocal
      )
      ) > "%target%"

      endlocal


      This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.






      share|improve this answer


























        2












        2








        2








        To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:



        @echo off
        setlocal EnableExtensions DisableDelayedExpansion
        set "rootname=Common Filename"

        set "replace="old">"
        set "replaced="new">"

        set "source=%rootname%_unqiue_suffix.txt"
        set "target=Fixed%source%"

        (
        for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
        set "line=%%b"
        setlocal EnableDelayedExpansion
        if defined line set "line=!line:%replace%=%replaced%!"
        echo(!line!
        endlocal
        )
        ) > "%target%"

        endlocal


        This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.






        share|improve this answer
















        To avoid loss of exclamation marks, enable delayed expansion only when it is really needed and expand normal % variables and for meta-variables only when delayed expansion is disabled:



        @echo off
        setlocal EnableExtensions DisableDelayedExpansion
        set "rootname=Common Filename"

        set "replace="old">"
        set "replaced="new">"

        set "source=%rootname%_unqiue_suffix.txt"
        set "target=Fixed%source%"

        (
        for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
        set "line=%%b"
        setlocal EnableDelayedExpansion
        if defined line set "line=!line:%replace%=%replaced%!"
        echo(!line!
        endlocal
        )
        ) > "%target%"

        endlocal


        This code still causes trouble in case the variables replace and replaced contain !-signs, because they are percent-expanded.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 12 '18 at 15:18

























        answered Nov 12 '18 at 15:04









        aschipfl

        18.1k82654




        18.1k82654






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53264174%2fescaping-exclamation-marks-with-delayed-expansion%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            這個網誌中的熱門文章

            Academy of Television Arts & Sciences

            L'Équipe

            1995 France bombings