3

我编写的查找和替换批处理脚本有问题。我需要能够打开一个文本文件并从 Windows 命令行更改其中的一些值。我无法安装 sed.exe 或 FART 或 powershell,所以我需要这样做。在linux中做起来容易得多......

到目前为止,我已经编写了以下脚本,如果我使用每行只有一个单词的文件,它可以完美运行,因此我可以轻松更改以下格式的文件

aaa
bbb
ccc

这是批处理文件:

@echo off
setlocal enabledelayedexpansion

if not exist "%1" (echo this file does not exist...)&goto :eof

for /f "tokens=* delims=" %%a in (%1) do (

   set write=%%a
   if "%%a"=="%2" set write=%3

   echo !write! 
   (echo !write!)>>%~n1.replaced%~x1
)

del %1
rename %~n1.replaced%~x1 %1

我的问题是我需要更改的大多数文件都包含多个字符串和数字值的行,如下所示:

AAA 1.5
BBB 25
CCC 0.1

谁能告诉我为什么我的脚本不会将BBB 25更改为BBB 45?与分隔符是空格有关吗?我很确定它与数字无关,好像我有一个单词文件,只是用空格分隔,我的脚本也不起作用。

我一直在搜索论坛,还没有发现这个问题,但我会继续搜索。无论如何,您的帮助将不胜感激。

更新
问题解决了!!我在DosTips.com上找到了BatchSubstitute.bat 的这个修订版,只需在临时文件中添加一个额外的回声就解决了我的问题。我仍然不确定为什么我发布的代码不起作用所以如果有人能解释它会很棒。我对这一切还是很陌生!

更新 2
这是我需要更改的典型输入文件:

k1 1e3
k2 2e5
n 1.5
x 10

在我运行脚本(replace.bat prefs.txt“k1 1e3”“k1 5e4”)之后,它应该是:

k1 5e4
k2 2e5
n 1.5
x 10

它应该能够更改文件中的任何行。上次更新论坛里的版本好像能用,就是不知道为什么我发的第一个版本不能用。

4

2 回答 2

1

回答您的 update2 问题。

它应该能够更改文件中的任何行。上次更新论坛里的版本好像能用,就是不知道为什么我发的第一个版本不能用。

这是因为该行
if "%%a"=="%2" set write=%3
与您的任何行都不匹配。
As%2将扩展到"k1 1e3"so 线将扩展到

if "%%a"==""k1 1e3"" set write="k1 5e4"

一个简单的波浪号就可以了
if "%%a"=="%~2" set write=%~3

于 2012-07-06T16:34:47.727 回答
0

是的,问题在于空格(或引号,如果您尝试将文本放在一起)

使用命令行test test.txt BBB 25 BBB 45, 然后 %2 是BBB并且它不会匹配BBB 2525 缺少

使用 , 的命令行test test.txt "BBB 25" "BBB 45",则 %2 是"BBB 25"并且它不会匹配 ,BBB 25因为缺少引号。

于 2012-07-06T16:37:25.547 回答