1

Я работаю с файлами 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%"

2 ответа2

1

К сожалению, этот ответ не выполняет никакого "поиска", но ваш файл может быть легко переписан в небольшое количество строк, поэтому может быть проще переписать содержимое файла ...?

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

1

Этот файл VBScript, который вы даете в своем вопросе, работает

Вы можете сказать set /p yyy=input number: или% ID%, как у вас.

Ниже я изменяю i <= 4 на i <=% гггг%

ууу = 44, так что становится я <= 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>

Так что просто сделайте файл с двумя строками. Один с set /p ... и один со строкой замены.

Или только одна строка

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

(заменит текст var на текст trt)

Вот 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-

но как найти идентификатор

Это делает НАЙТИ-
он смотрит на строку for, разбивает ее (токенизирует), используя оскорбительный вид cmd.exe для оператора. В этом случае я просто использовал пробел в качестве разделителя (хотя это можно улучшить). Затем он может найти номер, но он находит номер, за которым следует точка с запятой. В последней строке точка с запятой заменяется ничем, т. Е. Удаляет ошибочную точку с запятой.

@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

добавить еще одну строку после строки ..., которая была у меня на мгновение, пока я не нашел; нужно было сбежать! пакетные файлы не очень

Файл, с которым вы хотите работать

Файл 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, вы можете сделать 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>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .