String 批处理或VB脚本,用另一个文本文件中的字符串更新(或添加)一个文本文件中的字符串
第一个帖子在这里 我正在尝试使用另一个文本文件中的字符串更新(或添加)纯文本文件中的字符串 例如: File1.txt(参考文件)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中不存在的键,则应将它们单独保留 之外的任何内容都应保持不变 在
File2.txt(目标文件)
要求:
中,顺序就无关紧要
之外的任何内容都应保持不变 <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