Cum se returnează valoarea de la un fișier batch la fișierul batch apelant (Programare, Fișier Batch, Argumente În Linia De Comandă)

user2593173 a intrebat.

Am un fișier .bat comun care citește fișierul status.xml și află valoarea câmpului status. Acest fișier batch este apoi apelat de alte fișiere batch pentru a afla valoarea statusului. fișierele batch apelante trimit numele fișierului către fișierul bat comun.Nu reușesc să trimit statusul de la fișierul batch comun către fișierele batch apelante.Mă poate ajuta cineva?

main batch file
-- will call the common bat file and send the file name and a variable as arguments
setlocal
call Common.bat c:folderdirfilesstatus.xml val1
-- trying to print the status returned by the common bat file
echo [%val1%]

common batch file
@ECHO off
setlocal EnableDelayedExpansion

rem will loop through the file and read the value of the status tag
(for /F "delims=" %%a in (%1) do (
set "line=%%a"
set "newLine=!line:<Interface_status>=!"
set "newLine=!newLine:</Interface_status>=!"
if "!newLine!" neq "!line!" (
  @echo Status is !newLine!
rem I want to send`enter code here` the value of newLine to the calling batch file
  set %~2 = !newLine!   <--this does not work
)

)) 

2 răspunsuri
Magoo

În cadrul unei paranteze SETLOCAL/ENDLOCAL (unde EOF=ENDLOCAL) TOATE modificările aduse mediului sunt anulate.

Trebuie să setați o variabilă în cadrul Common.bat care să fie vizibilă după paranteza finală de închidere (adică valoarea de întoarcere – și ar putea fi un șir gol.

Apoi, în linia de după common.bat‘s final close-parenthesis, puneți această linie:

ENDLOCAL&set %~2=%returnvalue%

unde returnvalue conține valoarea pe care doriți să o returnați (amuzant, asta…)

BTW: Un șir de caractere SET este SPAȚIAL-SENSITIV. Dacă linia ar fi funcționat, ați fi setat variabila "VAR1 " – nu "VAR1" – spațiul de dinaintea lui = ar fi fost INCLUSE în numele variabilei – și orice spațiu după = la fel de bine incluse în valoarea atribuită.

Sintaxa

set "var=value"

este adesea utilizată pentru a exclude orice spațiu de final de linie (așa cum ar putea fi lăsat de unii editori)


(Sigh)…

@ECHO off
setlocal EnableDelayedExpansion

rem will loop through the file and read the value of the status tag
(for /F "delims=" %%a in (%1) do (
set "line=%%a"
set "newLine=!line:<Interface_status>=!"
set "newLine=!newLine:</Interface_status>=!"
if "!newLine!" neq "!line!" (
  @echo Status is !newLine!
rem SET THE RETURN VALUE
  set RETURNVALUE=!newLine!
)

)) 

ENDLOCAL&SET %~2=%RETURNVALUE%

Comentarii

  • Vă mulțumim pentru informații! Problema este că nu pot seta valoarea de returnare conținută în !newLine! la nicio altă variabilă. deci nu pot seta newline la returnvalue și să o folosesc după bloc –  > Por user2593173.
  • Mulțumesc! Aveam câteva linii de cod după bucla for care nu erau executate din anumite motive și de aceea valoarea de returnare nu era setată. –  > Por user2593173.
  • Pentru mine, ENDLOCAL și & trebuiau să fie împărțite în felul următor ENDLOCAL & set returnvalue=%returnvalue%, , re: ss64.org/viewtopic.php?pid=4940#p4940 — Nu știu dacă este o greșeală de tipar în răspunsul dat aici. –  > Por Alex Hall.
  • @AlexHall : Cel puțin în teorie, spațiile suplimentare nu sunt necesare. Nu m-am confruntat niciodată cu o situație în care să aveam nevoie de să le folosesc. Poate că dacă ați dezvolta puțin ce observații ați făcut, am putea cu toții să înțelegem ceva. –  > Por Magoo.
  • Nu sunt sigur ce a făcut diferența pentru ENDLOCAL& nu a funcționat pentru mine și ENDLOCAL & de lucru. Scriptul în care s-a întâmplat acest lucru a fost rulat dintr-o consolă; cu %returnvalue% atribuit anterior prin intermediul unui SET returnvalue=thisString comandă. Când am rulat scriptul de pe console noi, ENDLOCAL& set returnvalue=%returnvalue% nu avea ca rezultat faptul că %returnvalue% nu avea nicio atribuire de valoare (cu alte cuvinte, nu exista) în consolă; în timp ce ENDLOCAL & set returnvalue=%returnvalue% a sfârșit prin a avea o atribuire de valoare. De asemenea, acest lucru s-a întâmplat pe Windows 7. –  > Por Alex Hall.
jeb

Peter Wright descrie tehnica principală.

Ultima problemă pare să fie ieșirea din bucla for fără a pierde valoarea.

Puteți utiliza un GOTO :break ca GOTO oprește imediat toate buclele.

Nu este posibil să se utilizeze !newline! în cadrul ENDLOCAL deoarece aceasta s-ar extinde după blocul ENDLOCAL, , dar atunci este gol.

@ECHO off
setlocal EnableDelayedExpansion

for /F "delims=" %%a in (%1) do (
  set "line=%%a"
  set "newLine=!line:<Interface_status>=!"
  set "newLine=!newLine:</Interface_status>=!"
  if "!newLine!" neq "!line!" (
    @echo Status is !newLine!
    goto :break
  )
)

( 
  endlocal
  set "%~2=%newLine%"
)

Dacă valoarea dvs. din newLine ar putea conține ghilimele, atunci este mai bine să folosiți o tehnică puțin mai sigură:

for /F "delims=" %%a in ("!newline!") DO (
  endlocal
  set "%~2=%%~a" 
)

Comentarii

  • Sunt capabil să trec valoarea din common.bat în main.bat. Am totuși o întrebare. Dacă o aplicație invocă main.bat, atunci va putea să recupereze valoarea din main.bat? –  > Por user2593173.
  • Aplicația dvs. este, de asemenea, un fișier batch? Atunci este modul în care am arătat eu și Peter. Altfel, ați putea încerca să dați un ecou rezultat, iar aplicația filtrează fluxul stdin –  > Por jeb.