Polecenie wsadowe do wyszukiwania i zastępowania tekstu w tekście zawierającym plik inny niż TXT

1

Pracuję z JavaScript iMacro .js pliki, które są prostymi, niezaszyfrowanymi liniami tekstu podobnego do kodu. Plik zawiera następujący kod:

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

Ta pętla powtarza się 10 razy. Chcę pobrać dane wejściowe od użytkownika w pliku wsadowym, na przykład:

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

i zastąp to 10 liczbą wprowadzoną przez użytkownika, tj %ID%

Znalazłem to pytanie: Jak znaleźć i zastąpić tekst w pliku za pomocą środowiska wiersza polecenia systemu Windows?

Ale z jakiegoś powodu muszę użyć wbudowanych funkcji dostępnych w wierszu poleceń systemu Windows (nic zewnętrznego jak PowerShell itp.).

Coś, czego próbowałem (z powyższych odpowiedzi; nie zadziałało)

cscript replace.vbs "C:\XYZ.js" "i <= 10" "i <= %ID%"
SuperUserMan
źródło
Unikaj niepotrzebnego formatowania: po prostu sprawia, że ​​twoje pytanie jest trudniejsze do odczytania. Czy możesz wyjaśnić, co oznacza „tekst zawierający plik inny niż txt”? Przypuszczam też, że przez „DOS” faktycznie masz na myśli wiersz poleceń, więc oznaczam to jako [wsad].
and31415
@ and31415, a ponieważ patrzy na rozwiązanie vbscript w swoim pytaniu, nie jest nawet tak bardzo partiami .. bardziej jak cmd.exe / wiersz poleceń. i vbscript.
barlop
Nie mówi, że poszukuje konkretnie vbscript ... wygląda na to, że próbowali vbscript poprzez odpowiedź, którą przeczytali. Ciało pytania sugeruje również, że mogliby użyć dowolnego rozwiązania, które nie jest PowerShell itp.
Kinnectus
Starałem się, aby formatowanie było łatwiejsze i łatwiejsze do zrozumienia. „tekst zawierający plik inny niż txt” oznacza plik, który zawiera tekst / podstawowy kod nieszyfrowany, ale nie ma rozszerzenia .TXT. Tak czy inaczej. Tak, to jego BATCH. Nie szukam tylko rozwiązania Vb.
SuperUserMan

Odpowiedzi:

1

Ten plik vbscript, który podasz w swoim pytaniu, działa

Można powiedzieć set /p yyy=input number: lub% ID%, jak masz.

Poniżej zmieniam i & lt; = 4 na i & lt; =% rrr%

yyy = 44, więc staje się i & lt; = 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>

Zrób więc plik bat z dwiema liniami. Jeden z set / p ... i jeden z linią zastąpienia.

Albo tylko jedna linia

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

(zastąpi tekst var, tekstem trt)

Oto replace.vbs, z którym się łączysz. Widzę, że działa nawet bez wywoływania go za pomocą cscript. (testowany w 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>

AKTUALIZACJA-

tutaj jest metoda, która po prostu przepisuje tę dla linii

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

AKTUALIZACJA 2-

ale jak na znalezienie identyfikatora

Czyni to FIND-
Spogląda na linem, aby go rozdzielić (Tokeny to), używając obraźliwego pliku cmd.exe dla instrukcji. W tym przypadku użyłem spacji jako ogranicznika (choć można to poprawić). Może wtedy znaleźć numer, ale znajdzie numer, po którym następuje średnik. Ostatnia linia zastępuje średnik niczym, tzn. Usuwa zbłąkany średnik.

@ECHO OFF


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

echo %num:;=%

gdzie piszę zastępuje to używając 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>

AKTUALIZACJA 3

aby dodać kolejną linię po linii ... która miała mnie na chwilę, dopóki nie znalazłem; trzeba uciekać! pliki wsadowe nie są ładne

Plik, z którym chcesz pracować, to a.a

Plik bat, który uruchomisz, to w tym przypadku a2.bat. ale możesz nazwać to, co chcesz

jak widzisz, czyta a.a i zmienia to dodając linię po linii, o której wspomniałeś.

możesz również uruchomić a3.bat, aby zrobić to samo, co a3.bat a3.bat wygląda nieco lepiej, ponieważ zdałem sobie sprawę, że nadal mogę go uruchomić, nie przepuszczając wielu rzeczy, więc a3.bat jest trochę ale mniej brzydkie niż a2.bat, ale robią to samo.

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>

Powinienem zaznaczyć, że plik nietoperza, który dodaje linię, działa nieniszcząco. Tak więc a.a jest nadal taki sam. Jeśli chcesz, aby a.a została zmieniona, możesz to zrobić C:\blah>a2 >b.b<ENTER> C:\blah>copy b.b a.a<ENTER> wyprowadzić wyniki pliku wsadowego do nowego pliku, a następnie skopiować go na a.a.

Oto kolejna wersja pliku wsadowego, który również działa .. tym razem, chociaż robię kopię

a3.bat i a2.bat dają ten sam wynik.

i dla kopii użyłem kopii / y, aby nie prosić o zastąpienie pliku.

więc uruchamianie a2> b.b lub a3> b.b oznacza, że ​​wyniki przechodzą do b.b Następnie skopiuj / t b.b a.a i zastąpi oryginalny plik 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");
    }

-        żeby pokazać, że a2 działa tak samo

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

-

można to zrobić również za pomocą a3> b.b. Ponieważ dają ten sam wynik.

    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>

-         teraz widzisz, że a.a zmieniła się, aby dodać dodatkową linię

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

    C:\blah>
barlop
źródło
Dzięki Barlop za odpowiedź. Właśnie sprawdziłem i zadziałało. Pracowałem także nad innym rozwiązaniem z tego linku o nazwie „Script / batch utility o nazwie REPL.BAT”. Ale mam powiązane zapytanie. Czy mógłbyś uprzejmie przeczytać mój najnowszy komentarz na temat innej odpowiedzi na to pytanie. Dzięki Plz
SuperUserMan
Wiem, że zadałem już wiele pytań, ale jeśli możesz pomóc w czymś podobnym. To jest dla wyszukiwania i dodawania. Powiedz, że chcę dodać kolejną linię kodu iimPlay („DEF.iim”); poniżej wiersz iimPlay („ABC.iim”); w tym pliku .jsf, jakiego kodu wsadowego potrzebuję? Mogę otworzyć kolejne pytanie, jeśli powiesz :). Przepraszam za wiele pytań :) @barlop
SuperUserMan
dzięki za czas i wytrwałość w tak długich odpowiedziach. Nadal czytam i rozumiem .. bardzo mnie: P. Czy możesz zajrzeć tutaj & gt; superuser.com/questions/787262/… Wiem teraz, że próbuję Cię wynająć za darmo ... ale jeśli to możliwe, spójrz .... Dzięki
SuperUserMan
1

Niestety ta odpowiedź nie robi „wyszukiwania”, ale twój plik może być łatwo ponownie napisany w małej liczbie wierszy, więc może być łatwiej przepisać zawartość pliku ...?

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

To jest plik nietoperza, na przykład js.bat

Kinnectus
źródło
Rozumiem, co tam zrobiłeś, ale staraj się wyjaśnić swoją odpowiedź?
barlop
Plik OP ma tylko małą liczbę linii kodu (jak napisano). Mój kod wymaga wymaganej liczby pętli ( set /p ID="Enter Number: " ) i po prostu ponownie zapisuje plik javascript OP, ale wstawia liczbę pętli ze zmiennej wsadowej do definicji pętli i wyświetla resztę pliku do pliku o nazwie javascript.js - nie wiem, jak inaczej to wyjaśnić. .: S
Kinnectus
Dzięki. Nie próbowałem tego, ponieważ mam inne rozwiązanie. Ale planuję dodać więcej treści do tego pliku wsadowego. Czy w takim przypadku byłoby jeszcze łatwiej?
SuperUserMan
To, co zrobisz, zależy wyłącznie od ciebie ... być może funkcja „znajdź i zamień” może być łatwiejsza - jak teraz powiesz, będziesz rozszerzać plik javascript.js o dodatkową zawartość ... rozwiązanie, które przesłałem może stać się dość uciążliwe, jeśli plik JS stanie się dość duży ... rozwiązanie „szukaj -> zamień” może być lepsze. Po prostu kontynuowałem to, co włożyłeś w swoje pytanie :)
Kinnectus
Dzięki 4 odpowiedź. Chris mogę zapytać cię o coś związanego? Po zakończeniu tego pliku wsadowego wartość zostaje zastąpiona z 10 na% ID% (dane wejściowe użytkownika) i zostaje zapisana w pliku. Muszę ponownie uruchomić tę samą partię dla innego użytkownika. Tym razem nie mogę użyć wyszukiwania „i & lt; = 10”, ponieważ jego wartość w pliku zmieniła się na „i & lt; =% ID%”. Więc jak powinienem znaleźć wartość% ID% zaraz po „i & lt; =”. Jakieś polecenie wyszukiwania? TIA
SuperUserMan