用于在包含非 TXT 文件的文本中搜索和替换文本的批处理命令

用于在包含非 TXT 文件的文本中搜索和替换文本的批处理命令

我正在使用 iMacro JavaScript.js文件,这些文件是简单的未加密代码行。该文件包含以下代码:

var i;
for (i = 1; i <= 10; i++)
{
iimSet("loop", i);
iimPlay("ABC.iim");
}

此循环重复 10 次。我想在批处理文件中获取用户的输入,例如:

set /p ID="Enter Number: " %=%

并将此 10 替换为用户输入的数字,即%ID%

我发现了这个问题:如何使用 Windows 命令行环境查找和替换文件中的文本?

但是,由于某种原因,我必须使用 Windows 命令提示符中可用的内置函数(没有像 PowerShell 等外部函数)。看一下。

我尝试过的方法(根据以上答案;没有用)

cscript replace.vbs "C:\XYZ.js" "i <= 10" "i <= %ID%"

答案1

您在问题中提供的 vbscript 文件有效

您可以set /p yyy=input number: 像以前一样说或 %ID%。

下面我将 i <= 4 改为 i <= %yyy%

yyy=44 所以变成 i <= 44

C:\blah>type a.a
var i;
for (i = 1; i <= 4; i++)
{
iimSet("loop", i);
iimPlay("ABC.iim");
}

C:\blah>set yyy=44

C:\blah>replace a.a "i <= 4" "i <= %yyy%"

C:\blah>type a.a
var i;
for (i = 1; i <= 44; i++)
{
iimSet("loop", i);
iimPlay("ABC.iim");
}
C:\blah>

因此,只需创建一个包含两行的 bat 文件。一行包含 set /p...,另一行包含 replace 行。

或者只有一行

C:\blah>set /p ggg= & replace a.a var trt

(将用文本 trt 替换文本 var)

这是您链接到的 replace.vbs。我发现它即使没有使用 cscript 调用也可以执行。(在 Win 7 中测试)

C:\blah>type replace.vbs
Const ForReading = 1
Const ForWriting = 2

strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText  'WriteLine adds extra CR/LF
objFile.Close
C:\blah>

更新-

这是一个重写行的方法

@ECHO OFF

REM run like repla 4 to make i <= 4  e.t.c.
REM C:\blah>repla 4<ENTER>

for /f "tokens=1,*" %%f in (a.a) do @(
IF NOT %%f == for (
  echo %%f %%g  
) ELSE (
    ECHO for ^(int i=0; i ^<= %1; i++^)
)
)

更新2-

但至于找到id

这执行了 FIND -
它查看 for 行,然后使用看起来很冒犯的 cmd.exe for 语句将其拆分(标记化)。在本例中,我仅使用空格作为分隔符(尽管可以改进)。然后它可以找到数字,但它找到的数字后面跟着一个分号。最后一行用空字符替换分号,即删除了多余的分号。

@ECHO OFF


for /f "tokens=1-12" %%f in (a.a) do @(
IF %%f == for set num=%%l
)

echo %num:;=%

我写替换的地方是使用 replace.vbs

C:\blah>type a.a
var i;
for (i = 1; i <= 10; i++)
{
iimSet("loop", i);
iimPlay("ABC.iim");
}
C:\crp>findit
10

C:\blah>replace a.a "i <= 10" "i <= 20"

C:\blah>type a.a
var i;
for (i = 1; i <= 20; i++)
{
iimSet("loop", i);
iimPlay("ABC.iim");
}
C:\blah>findit
20

C:\blah>

更新 3

在一行之后添加另一行..这让我困惑了一会儿,直到我发现 ; 需要转义!批处理文件并不漂亮

您要处理的文件是 aa

在这种情况下,您将运行的 bat 文件是 a2.bat。但您可以随意命名

如您所见,它读取 aa 并修改它,在您提到的行后添加一行。

您也可以运行 a3.bat 来执行与 a3.bat 相同的操作 a3.bat 看起来更简洁一些,因为我意识到我仍然可以让它工作而不需要全力以赴地逃避很多东西,所以 a3.bat 看起来比 a2.bat 稍微不那么丑陋,但它们的作用相同。

C:\blah>type a.a
var i;
for (i = 1; i <= 20; i++)
{
iimSet("loop", i);
iimPlay("ABC.iim");
}

C:\blah>type a2.bat
@echo off
for /f "tokens=*" %%f in (a.a) do (
  echo %%f
  if %%f == iimPlay^(^"ABC.iim^"^)^; echo iimPlay^(^"DEF.iim^"^)^;
)

C:\blah>a2
var i;
for (i = 1; i <= 20; i++)
{
iimSet("loop", i);
iimPlay("ABC.iim");
iimPlay("DEF.iim");
}

C:\blah>

我应该指出,添加一行的 bat 文件是无损的。所以 aa 还是一样。如果你想要改变 aa,你可以将C:\blah>a2 >b.b<ENTER> C:\blah>copy b.b a.a<ENTER> 批处理文件的结果输出到一个新文件,然后将其复制到 aa 上

这是批处理文件的另一个版本,也可以使用。不过这次我复制了

a3.bat 和 a2.bat 给出相同的结果。

对于复制,我使用了 copy /y,这样它就不会要求覆盖文件。

因此运行 a2 >bb 或 a3>bb 意味着结果转到 bb 然后复制 /t bb aa 并覆盖原始 aa 文件

    C:\crp>type a3.bat
    @echo off
    for /f "tokens=*" %%f in (a.a) do (
      echo %%f
      if "%%f" == "iimPlay("ABC.iim");" echo iimPlay("DEF.iim"^)^;
    )

    C:\crp>a3
    var i;
    for (i = 1; i <= 20; i++)
    {
    iimSet("loop", i);
    iimPlay("ABC.iim");
    iimPlay("DEF.iim");
    }

- 只是为了证明 a2 的工作原理相同

    C:\crp>a2
    var i;
    for (i = 1; i <= 20; i++)
    {
    iimSet("loop", i);
    iimPlay("ABC.iim");
    iimPlay("DEF.iim");
    }

-

也可以使用 a3 >bb 来实现。因为它们给出相同的输出。

    C:\blah>a2 >b.b

    C:\blah>copy /y b.b a.a
            1 file(s) copied.

    C:\blah>copy b.b a.a  <-- you wouldn't do this line. i'm just showing the point of /y
    Overwrite a.a? (Yes/No/All):
            0 file(s) copied.

    C:\blah>copy /y b.b a.a
            1 file(s) copied.

    C:\blah>

- 现在你看到 aa 已经更改为包含附加行

    C:\blah>type a.a
    var i;
    for (i = 1; i <= 20; i++)
    {
    iimSet("loop", i);
    iimPlay("ABC.iim");
    iimPlay("DEF.iim");
    }

    C:\blah>

答案2

不幸的是,这个答案没有进行任何“搜索”,但您的文件可以用少量的行轻松地重写,因此重写文件内容可能会更容易......?

set /p ID="Enter Number: "
@echo off
@echo var i;> javascript.js
@echo for (i = 1; i ^<^= %ID%; i++)>> javascript.js
@echo {>> javascript.js
@echo iimSet("loop", i);>> javascript.js
@echo iimPlay("ABC.iim");>> javascript.js
@echo }>> javascript.js

这是一个 bat 文件,例如,js.bat

相关内容