Aby Wartości parametrów Return Muszę zmienić ciąg, który wymaga zastąpienia wykrzykników Wyrażenie, aby te wykrzykniki były uciekły później w tym procesie. Obecne rozwiązanie nie działa wewnątrz, jeśli. Poniższy skrypt roboczy pokazuje dość dobrze:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

    SET string="World^! wasserschutzpolizei^!"

    REM REM Works quite well here!
    REM SET "return1=!string:"=""!"
    REM SET "return1=%return1:!=^^^!%"
    REM SET "return1=!return1:""="!"
    REM ECHO !return1!

    IF NOT "!string!"=="" (
        SET "return1=!string:"=""!"

        REM This line doesn't work because of the % % inside the if...
        REM Because it is one logical line.
        SET "return1=%return1:!=^^^!%"
        SET "return1=!return1:""="!"

        ECHO !return1!
    )

    EXIT /B 0
ENDLOCAL

Miałem jedno nieporodne podejście, które używa CALL SET:

CALL SET "return1=%%return1:!=^^^!%%" Ale to nie działa.

Odpowiedź uważa, że potrzebuję opóźnionej ekspansji dla innych rzeczy.

Jak więc muszę zmienić kod, zwłaszcza linia {X0}}, dzięki czemu działa w tym?

1
goulashsoup 5 czerwiec 2018, 00:06

3 odpowiedzi

Najlepsza odpowiedź

Unikaj używania instrukcji wielointerowych w skryptach wsadowych. Nie tylko trudno je zdobyć, trudno je debugować podczas opracowywania kodu. Opóźniona ekspansja jest najbardziej przydatna, gdy trzeba użyć zmiennych w ramach zmiennych wyrażeń wymiany. Oto twój kod prosty sposób:

@setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@set prompt=$G

set input="World^! wasserschutzpolizei^!"

@rem Works quite well here!
@set "return1=!input:"=""!"
@set "return1=%return1:!=^^^!%"
@set "return1=!return1:""="!"
@echo %return1%

@if not "!input!"=="" call :DoIt
@echo %return1%
@exit /b 0

:DoIt
@set "return1=!input:"=""!"
@set "return1=%return1:!=^^^!%"
@set "return1=!return1:""="!"
@exit 

Użyj podprogramów, gdy nie można użyć krótkiego prostego wyrażenia dla if / pętli.

0
jwdonahue 4 czerwiec 2018, 21:32

Jeśli odwrócisz swoje myślenie i zamiast używać IF NOT …(, używany IF …, nie miałbyś tego problemu, ponieważ nie byłbyś ustawiający zmiennych w bloku:

@ECHO OFF
SET "string=World! wasserschutzpolizei!"

IF "%string%"=="" EXIT /B 1

SET "return1=%string:"=""%"
SET "return1=%return1:!=^^^!%"
SET "return1=%return1:""="%"
ECHO %return1%

PAUSE
EXIT /B 0

Ciąg będzie teraz przede-uciekł wykrzyknikom gotowy do późniejszego procesu.

0
Compo 5 czerwiec 2018, 08:39

Podobnie jak odpowiedź Compo, ale ten pracuje również na więcej niż jedną zmienną powrotną.

IF defined string (
  SET "return1=!string:"=""!"
)
IF defined string (
    SET "return1=%return1:!=^^^!%"
    SET "return1=!return1:""="!"
)

Rozbija kod na dwa oddzielne bloki, dlatego procentowa ekspansja będzie działać

0
jeb 5 czerwiec 2018, 09:05