Jak poprawnie uciec '=' w moim skrypcie zastępującym ciąg?

4

Stworzyłem skrypt wsadowy, który zastępuje ciągi znaków w określonym pliku tekstowym. W moim pliku ciąg OutDir=binpowinien zostać zastąpiony jako, OutDir=Buildale otrzymuje dane wyjściowe jako bin=OutDir=Build=bin. Jak mogę uciec =in OutDir=bintak, że ciąg nie staje się nieczytelny? Próbowałem, OutDir^=ale użycie marchewki też nie działa.

Oto mój obecny skrypt:

@echo off 
    setlocal enableextensions disabledelayedexpansion

    set search=OutDir=bin
    set replace=OutDir=Build

    set textFile=%DOCUMENT%.txt

    for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%textFile%" echo(!line:%search%=%replace%!
        endlocal
    )

Próbowałem zmienić znajdź i zamień zmienne, aby skompensować =ciąg, który zastępuję, ale żadna nie działała:

set search= "OutDir=bin"
set replace= "OutDir=Build"

set search="OutDir=bin"
set replace="OutDir=Build"

set "search=OutDir=bin"
set "replace=OutDir=Build"

"set search=OutDir=bin"
"set replace=OutDir=Build"
Pan Mendelli
źródło
Zakładam, że już go trochę przejrzałeś, ale przeczytałeś to i wszystkie odpowiedzi tutaj ( stackoverflow.com/questions/9556676/... ), ale w szczególności odpowiedź autorstwa dbenham i link podany w DosTips dla dodatkowych pomysłów itp. Może być łatwiej poradzić sobie z Batch za pomocą małego PowerShell, jeśli jest to coś, co chcesz wypróbować - powinieneś być w stanie umieścić PowerShell bezpośrednio w partii i pozwolić na to za pomocą PowerShell, ale może być przezroczysty, jeśli napiszesz poprawnie więc po prostu masz uruchamiany skrypt wsadowy.
Pimp Juice IT
Nie znam wystarczająco programu PowerShell, aby nawet spróbować . Jest to integrowane z istniejącym skryptem wsadowym, więc musi być wsadowy.
Pan Mendelli,
1
Rozumiem wszystko, co mówisz. Jeśli chcesz w prosty sposób sprawdzić, czy to potencjalnie zadziała i da ci pożądane wyniki, spójrz na tekst szybkiego skryptu wsadowego, który możesz uruchomić jako wsadowy, tak jak w przypadku każdego innego skryptu wsadowego: justpaste .it / 1f9xv . Proszę pamiętać, że PowerShell jest rodzimym systemem Windows, a język jest tak naprawdę tylko tekstem, więc jeśli konwersja exe nie zepsuje tekstu partii, to nie powinno być tak samo tutaj. To powinno być na tyle proste, że możesz zrobić mały test, więc na wypadek, gdyby okazało się to pomocne, proszę bardzo.
Pimp Juice IT
1
Daj mi znać, jak to działa, a jeśli znajdziesz coś pomocnego lub wymagającego dostosowania lub potwierdzisz, że może on działać podczas testowania itp., Daj mi znać. Z przyjemnością dodam odpowiedź o wiele bardziej szczegółową, jeśli uważasz, że może to być możliwe w twoim środowisku.
Pimp Juice IT
1
Dziękuję Ci bardzo! Przetestuję to jak najszybciej. Po zakończeniu testowania skontaktuję się z Tobą.
Pan Mendelli,

Odpowiedzi:

2

Zastępowanie równego symbolu =w ciągu ciągiem za pomocą programu PowerShell

Po przetestowaniu, a następnie badaniu, natrafiłem na tę odpowiedź na StackOverflow, która następnie wskazała również ten wątek i posty na DosTips i zastąpienie go =czystą partią nie jest łatwe.

Kiedy napotykam problemy ze skryptami wsadowymi, które wymagają mnóstwa skomplikowanej logiki wsadowej lub po prostu nie mogę dowiedzieć się, jak sprawić, by działało łatwo, zwykle próbuję włączyć PowerShell do miksu, ponieważ jest on natywny dla systemu Windows i może być znacznie bardziej niezawodny niż partia bez złożonej logiki.

Poniższy skrypt wsadowy będzie zasadniczo:

  • Użyj ciągów Get-Content and Replace, aby wyszukać i zamienić ciąg
  • Następnie użyje Set-Content, aby odpowiednio wstawić nowo zastąpiony ciąg do pliku

Scenariusz

@echo off
setlocal enableextensions disabledelayedexpansion

set search=OutDir=bin
set replace=OutDir=Build
set textFile=%DOCUMENT%.txt

:PowerShell
SET PSScript=%temp%\~tmpStrRplc.ps1
ECHO (Get-Content "%~dp0%textFile%").replace("%search%", "%replace%") ^| Set-Content "%~dp0%textFile%">"%PSScript%"

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"
EXIT

Wynik wyjściowy

OutDir=Build

Dalsze zasoby

Pimp Juice IT
źródło