Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 批处理或VB脚本,用另一个文本文件中的字符串更新(或添加)一个文本文件中的字符串_String_Batch File_Replace_Reference - Fatal编程技术网

String 批处理或VB脚本,用另一个文本文件中的字符串更新(或添加)一个文本文件中的字符串

String 批处理或VB脚本,用另一个文本文件中的字符串更新(或添加)一个文本文件中的字符串,string,batch-file,replace,reference,String,Batch File,Replace,Reference,第一个帖子在这里 我正在尝试使用另一个文本文件中的字符串更新(或添加)纯文本文件中的字符串 例如: File1.txt(参考文件) File2.txt(目标文件) 要求: 如果file2.txt已经包含一个或所有键(即1到22),我想用file1.txt的键替换这些键 如果file2.txt缺少file1.txt中存在的任何键,则需要添加这些键。只要它们出现在中,顺序就无关紧要 如果file2.txt包含file1.txt中不存在的键,则应将它们单独保留 之外的任何内容都应保持不变 在

第一个帖子在这里

我正在尝试使用另一个文本文件中的字符串更新(或添加)纯文本文件中的字符串

例如:

File1.txt(参考文件)


File2.txt(目标文件)



要求:

  • 如果file2.txt已经包含一个或所有键(即1到22),我想用file1.txt的键替换这些键

  • 如果file2.txt缺少file1.txt中存在的任何键,则需要添加这些键。只要它们出现在
    中,顺序就无关紧要

  • 如果file2.txt包含file1.txt中不存在的键,则应将它们单独保留

  • 之外的任何内容都应保持不变

  • 在简要测试了Dbenham的最后一个脚本之后,看起来它完成了所有事情,但是上面和下面的行都被移动了(我的错误是没有提供完整的示例)

    以下是Dbenham脚本的当前输出:

      <150 strings>
      </150 strings>
    
      <appSettings>
      </appSettings>
        <startup>
            <supportedRuntime/>
        </startup>
    </configuration>
        <add key="1" value="False" />
        <add key="2" value="C:\Temp" />
        <add key="3" value="True" />
        <add key="4" value="True" />
        <add key="5" value="False" />
        <add key="6" value="False" />
        <add key="7" value="False" />
        <add key="8" value="False" />
        <add key="9" value="False" />
        <add key="10" value="newkey" />
        <add key="11" value="False" />
        <add key="12" value="127.0.0.1" />
        <add key="13" value="True" />
        <add key="14" value="True" />
        <add key="15" value="False" />
        <add key="16" value="False" />
        <add key="17" value="False" />
        <add key="18" value="True" />
        <add key="19" value="True" />
        <add key="20" value="True" />
        <add key="21" value="True" />
        <add key="22" value="True" />
    
    
    
    @ECHO OFF
    SETLOCAL
    ::删除以$or开头的变量#
    对于%%b IN($#)DO For/F“delims=”%%a IN('set%%b 2^>Nul')DO set“%%a=”
    对于/f“delims=“%a IN(reference.txt)DO FOR/f”标记=3delims==”%h IN(“%a”)DO(
    设置“$%%~h=%%a”
    )
    对于/f“delims=“%a IN(target.txt)DO FOR/f”标记=3delims==”%h IN(“%a”)DO(
    设置“#%%~h=%%a”
    )
    (
    对于/F“tokens=1*delims=$=”%%c In('set$2^>Nul')DO(
    回声(%%d
    设置“#%%c=”
    )
    对于/F“tokens=1*delims=”%%c In('set#2^>Nul')DO(
    回声(%%d
    )
    )>newfile.txt
    后藤:EOF
    
    您的源数据包含“智能引号”-我假设您实际使用了引号

    基本上,设置
    $keyname
    =参考行;
    #keyname
    =目标行

    然后输出所有
    $keyname
    ,并清除任何具有相同keyname的
    #keyname

    最后,输出所有剩余的
    #keyname
    s


    结果显示在
    newfile.txt

    这里是基于更新问题的新答案

    您真的应该使用一个设计用于编辑XML的工具。有许多方法可以修改配置文件(file2.txt),使其仍然有效,但这会破坏任何纯批处理解决方案。但是,假设布局没有改变您显示的内容

    如果只需将file2.txt中的appSettings替换为file1.txt的内容,则:

    @echo off
    setlocal enableDelayedExpansion
    set "replace="
    >file2.txt.new (
      for /f "delims=" %%A in (file2.txt) do (
        set "ln=%%A"
        if "!ln:</appSettings>=!" neq "!ln!" (
          type file1.txt
          set "replace="
        )
        if not defined replace echo(!ln!
        if "!ln:<appSettings>=!" neq "!ln!" set replace=1
      )
    )
    move /y file2.txt.new file2.txt >nul
    

    以下是基于原始问题中的file1.txt和file2.txt规范的原始答案:

    File1.txt(参考文件)

    如果键可能包含空格或制表符,但不包含反斜杠,则:

    @echo off
    >file1.txt.screen (for /f "tokens=2" %%A in (file1.txt) do echo( %%A )
    >file2.txt.new (
      findstr /livg:file1.txt.screen file2.txt
      type file1.txt
    )
    del file1.txt.screen
    move /y file2.txt.new file2.txt >nul
    
    @echo off
    >file1.txt.screen (for /f tokens^=2^ delims^=^" %%A in (file1.txt) do echo( key="%%A" )
    >file2.txt.new (
      findstr /livg:file1.txt.screen file2.txt
      type file1.txt
    )
    del file1.txt.screen
    move /y file2.txt.new file2.txt >nul
    
    @echo off
    setlocal disableDelayedExpansion
    >file1.txt.screen (
      for /f tokens^=2^ delims^=^" %%A in (file1.txt) do (
        set "key=%%A"
        setlocal enableDelayedExpansion
        (echo( key="!key:\=\\!" )
        endlocal
      )
    )
    >file2.txt.new (
      findstr /livg:file1.txt.screen file2.txt
      type file1.txt
    )
    del file1.txt.screen
    move /y file2.txt.new file2.txt >nul
    
    如果键可能包含空格、制表符或反斜杠,则:

    @echo off
    >file1.txt.screen (for /f "tokens=2" %%A in (file1.txt) do echo( %%A )
    >file2.txt.new (
      findstr /livg:file1.txt.screen file2.txt
      type file1.txt
    )
    del file1.txt.screen
    move /y file2.txt.new file2.txt >nul
    
    @echo off
    >file1.txt.screen (for /f tokens^=2^ delims^=^" %%A in (file1.txt) do echo( key="%%A" )
    >file2.txt.new (
      findstr /livg:file1.txt.screen file2.txt
      type file1.txt
    )
    del file1.txt.screen
    move /y file2.txt.new file2.txt >nul
    
    @echo off
    setlocal disableDelayedExpansion
    >file1.txt.screen (
      for /f tokens^=2^ delims^=^" %%A in (file1.txt) do (
        set "key=%%A"
        setlocal enableDelayedExpansion
        (echo( key="!key:\=\\!" )
        endlocal
      )
    )
    >file2.txt.new (
      findstr /livg:file1.txt.screen file2.txt
      type file1.txt
    )
    del file1.txt.screen
    move /y file2.txt.new file2.txt >nul
    
    由于此FINDSTR错误,上述所有解决方案在查找密钥时都必须执行不区分大小写的搜索:

    更新

    下面是一个不区分大小写的解决方案,它消除了所有限制

    @echo off
    setlocal disableDelayedExpansion
    for /f tokens^=2^ delims^=^" %%A in (file1.txt) do (
      set "search= key="%%A" "
      setlocal enableDelayedExpansion
      (echo !search:\=\\!) >file2.txt.screen
      findstr /vlg:file2.txt.screen file2.txt >file2.txt.new
      move /y file2.txt.new file2.txt >nul
      endlocal
    )
    type file1.txt >>file2.txt
    del file2.txt.screen
    

    在这里发布之前,你已经尝试过什么?你能提供一些例子吗?我使用findstr从其他文件中提取字符串来创建“file1.txt”,但需要一些关于从何处开始完成上述操作的指导。由于对脚本编写非常陌生,我无法理解一些稍微类似的SO场景/问题上的脚本。谢谢如果我正确理解了您的解释,最后File2.txt将包含与File1.txt相同的内容,因此简单的
    复制File1.txt File2.txt/y
    将解决此问题!让两个文件的另一行不同于“
    ”一个?如果是这样的话,列出两个文件的一小段非常重要…如果不说,我想您希望保留文件2中不存在于文件1中的现有键值。这与@Aacini正在生成的相同点。dbenham,您是正确的。文件2中有一些值不存在于文件1中,否则副本将起作用。。。现在正在上传一些“真实”的示例。+1,有趣的方法。两个限制-1)键值必须不区分大小写。遇到同样的问题。2)您的键不能包含
    =
    。如果先处理目标文件,并让两个文件都定义$variables,则可以消除#变量。引用将覆盖目标$variables。那么你只需要一个FOR/F循环来产生输出。谢谢你的回答!Dbenham-这非常接近所需的内容,只是我没有提到在正在修改/添加的键的上方和下方有字符串(应该保持不变)。我现在用这些完整的例子更新我原来的帖子。非常感谢!“以上两种解决方案都会损坏包含的内容。如果需要支持,可以进行更改。”我刚刚意识到!字符用于注释file2.txt中的行(这些行需要保留)。简单的改变?经过进一步的研究,禁用DelayedExpansion才是最重要的!性格看起来这是一个非常复杂的脚本更改,以适应这个角色。。。任何建议都将不胜感激,谢谢!没有意识到评论不会通知已经发表评论的用户,只是用@来通知;感谢dbenhamIn您的“这是第二个解决方案的修改版本,在内容中保留了!个字符”脚本,对于行
    if“!ln:=!“neq”!ln!”(
    ),有没有办法在我们搜索的字符串中包含空格?例如
    if”!ln:workflow=!“neq”!ln!”(
    。我已经尝试过用双引号将其括起来
    @echo off
    >file1.txt.screen (for /f tokens^=2^ delims^=^" %%A in (file1.txt) do echo( key="%%A" )
    >file2.txt.new (
      findstr /livg:file1.txt.screen file2.txt
      type file1.txt
    )
    del file1.txt.screen
    move /y file2.txt.new file2.txt >nul
    
    @echo off
    setlocal disableDelayedExpansion
    >file1.txt.screen (
      for /f tokens^=2^ delims^=^" %%A in (file1.txt) do (
        set "key=%%A"
        setlocal enableDelayedExpansion
        (echo( key="!key:\=\\!" )
        endlocal
      )
    )
    >file2.txt.new (
      findstr /livg:file1.txt.screen file2.txt
      type file1.txt
    )
    del file1.txt.screen
    move /y file2.txt.new file2.txt >nul
    
    @echo off
    setlocal disableDelayedExpansion
    for /f tokens^=2^ delims^=^" %%A in (file1.txt) do (
      set "search= key="%%A" "
      setlocal enableDelayedExpansion
      (echo !search:\=\\!) >file2.txt.screen
      findstr /vlg:file2.txt.screen file2.txt >file2.txt.new
      move /y file2.txt.new file2.txt >nul
      endlocal
    )
    type file1.txt >>file2.txt
    del file2.txt.screen