Piszę jeden program instalacyjny wsadowy i muszę sprawdzić wersję Java podczas konfiguracji. Aby to zrobić, używam następującego kodu w mojej partii:

JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)

Ale z jakiegoś powodu nie działa, pojawia się następujący komunikat o błędzie:

2 was unexpected at this time.

Jeśli nie piszę komendy do FOR pętla następnie IF zostanie wykonana. Jeśli umieściłem ECHO poza IF podczas rurociągów i nie używaj IF, ECHO zostanie wykonany.

Więc z jakiegoś powodu kombinacja rurociągów i {x0}} nie działa. Co powinienem zrobić?

1
SYOB SYOT 16 luty 2017, 12:04

3 odpowiedzi

Najlepsza odpowiedź

Niestety nie potrafię wyjaśnić, dlaczego nie działa (otrzymuję 2 was unexpected at this time.); ale zgaduję, że ma coś wspólnego z faktem, że IF jest jednym z poleceń (FOR, IF, REM), które są ujmowane wcześniej niż wszystkie inne przez Tłumaczenie poleceń CMD, wraz z faktem, że rura (|) instancja instancji {X7}} po obu stronach.

Istnieją jednak pewne opcje:

  1. Umieść polecenie JAVA również do pętli FOR /F:

    FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`JAVA -version 2^>^&1 ^| FIND "version" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)
    
  2. Użyj pliku tymczasowego:

    1. Przeczytaj plik tymczasowy w pętli FOR /F:

       {x1}} 
    2. Odczytaj plik tymczasowy poza FOR /F pętla:

       JAVA -version > "%TEMP%\file.tmp" 2>&1
      < "%TEMP%\file.tmp" (FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "version" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.))
      DEL "%TEMP%\file.tmp"
       
  3. Owiń instancję innego CMD jawnie, aby ukryć rurę z polecenia IF:

    JAVA -version 2>&1 | CMD /C FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)
    

Dziwne ustalenia:

  • Stephan stwierdził inne prace-około: za pomocą operatora porównania == zamiast EQU - Zobacz Jego komentarz; Ale to już nie pozwala na więcej porównań całkowitych numerycznych:

    JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2 == 2 ECHO INSIDE IF STATEMENT.)
    
  • Po ucieczce (przynajmniej) przestrzeń natychmiast za IF przez ^, wiersza poleceń działa nieoczekiwanie:

    JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF^ 2 EQU 2 ECHO INSIDE IF STATEMENT.)
    
  • Włóż REM/ ^& natychmiast przed IF:

    JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (REM/ ^& IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)
    

Weź również spojrzenie do tego bardzo interesującego powiązanego wątku: Co się stanie, gdy polecenie Przejrzę do tego?

1
aschipfl 21 marzec 2019, 19:40

Proszę zobaczyć Tutaj

Więc kod może być

JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2^  EQU 2 ECHO INSIDE IF STATEMENT.)
3
Community 23 maj 2017, 12:17

Łatwiej jest, gdy wyraźnie zdefiniujesz wykonywalne, które są zgodne z rurą

JAVA -version 2>&1 | CMD /C"FOR /F "TOKENS=2 DELIMS=." %A IN ('FIND "VERSION" /I') DO IF %A EQU 8 ( ECHO Java 8 ) ELSE ( ECHO NO Java 8 )"
3
MC ND 16 luty 2017, 10:22