Comando em lote para pesquisar e substituir texto em um texto que contenha arquivos não-TXT

1

Estou trabalhando com arquivos .js do iMacro JavaScript, que são linhas simples e não criptografadas de texto semelhante a código. O arquivo contém o seguinte código:

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

Este laço repete 10 vezes. Eu quero ter a entrada do usuário em um arquivo de lote, como diz:

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

e substitua este 10 pelo número digitado pelo usuário, por exemplo, %ID%

Eu encontrei esta pergunta: Como você pode encontrar e substituir texto em um arquivo usando o ambiente de linha de comando do Windows?

Mas, por algum motivo, eu tenho que usar funções internas disponíveis no prompt de comando do Windows (nada externo como o PowerShell, etc.) Dê uma olhada.

Algo que tentei (das respostas acima, não funcionou)

cscript replace.vbs "C:\XYZ.js" "i <= 10" "i <= %ID%"
    
por SuperUserMan 23.07.2014 / 15:12

2 respostas

1

Esse arquivo vbscript que você dá em sua pergunta funciona

Você pode dizer set /p yyy=input number: ou% ID% como você fez.

Abaixo eu altero i < = 4, para i < =% yyy%

yyy = 44, então se torna 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>

Portanto, basta criar um arquivo bat com duas linhas. Um com set / p ... e um com a linha de substituição.

Ou apenas uma linha

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

(irá substituir o texto var, com o texto trt)

Aqui está o replace.vbs ao qual você se conectou. Eu vejo que ele executa mesmo sem invocá-lo com cscript. (testado no 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>

UPDATE -

aqui é um método que apenas reescreve aquele para a linha

@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++^)
)
)

UPDATE 2 -

mas como para encontrar o id

Isso faz com que o FIND- ele olha para o linem que o divide (o Tokenises) usando o cmd.exe ofensivo para a declaração. Neste caso, usei apenas espaço como delimitador (embora isso possa ser melhorado). Pode então encontrar o número, mas ele encontra o número seguido por um ponto e vírgula. A última linha substitui o ponto-e-vírgula por nada, ou seja, remove o ponto e vírgula perdido.

@ECHO OFF


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

echo %num:;=%

onde escrevo substituo o uso de 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>

UPDATE 3

para adicionar outra linha depois de uma linha .. que me teve por um momento até que eu encontrei o; precisava ser escapado! arquivos em lote não são bonitos

O arquivo com o qual você deseja trabalhar é a.a

O arquivo bat que você vai rodar é a2.bat neste caso. mas você pode nomear o que quiser

como você pode ver, ele lê a.a e altera a adição de uma linha após a linha que você mencionou.

você também pode executar o a3.bat para fazer o mesmo que a3.bat O a3.bat parece um pouco mais simples porque é onde eu percebi que ainda poderia fazê-lo funcionar sem explodir ao máximo escapando de muita coisa, então a3.bat é um pouco menos feio do que a2.bat, mas eles fazem a mesma coisa.

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>

Devo salientar que o arquivo bat que adiciona uma linha funciona de forma não destrutiva. Então a.a ainda é o mesmo. Se você quisesse que a.a fosse alterado, você poderia fazer C:\blah>a2 >b.b<ENTER> C:\blah>copy b.b a.a<ENTER> para enviar os resultados do arquivo em lote para um novo arquivo e copiá-lo para a.a.

Aqui está outra versão do arquivo de lote que também funciona ... desta vez eu copio

a3.bat e a2.bat fornecem o mesmo resultado.

e para a cópia, eu usei o copy / y, para que ele não pedisse para sobrescrever o arquivo.

então rodando a2 > b.b ou a3 > b.b significa que os resultados vão para b.b Então copie / t b.b a.a e ele sobrescreve o arquivo original a.a

    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");
    }

       só para mostrar que a2 funciona da mesma forma

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

-

isso poderia ter sido feito com a3 & bt; b.b também. Como eles dão o mesmo resultado.

    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>

        agora você vê a.a mudou para incluir a linha adicional

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

    C:\blah>
    
por 23.07.2014 / 15:59
1
Infelizmente esta resposta não faz nenhuma "busca", mas seu arquivo pode ser facilmente reescrito em um pequeno número de linhas, então pode ser mais fácil reescrever o conteúdo do arquivo ...?

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

Este é um arquivo bat assim, por exemplo, js.bat

    
por 23.07.2014 / 15:53