windows - returstreng fra ekstern funktion batch

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har to batch-filer. Den ene er den vigtigste (opkalds) fil og den ene er en funktion.
Funktionen tager en parameter, gør nogle ting, og så vil jeg returnere strengen til opkalderen (main.bat). \% ERRORLEVEL\% er ikke en mulighed, da det kun kan returnere heltal.


main.bat:

call function.bat hello

function.bat:

REM some code.......

[[HER KODE TIL AT RETURNERE EN STRING TIL CALLER FIL]]

Virker som en grundlæggende operation, så der må være en måde. Jeg foretrækker heller ikke at lave filer med output og læse det i main.bat, fordi jeg vil gøre det til at fungere som en brugervenlig funktion.

Bedste reference


De to batch-filer udføres begge med samme Windows-kommandoprocessorproces og deler derfor alle miljøvariabler.


Main.bat:


@echo off
set "MyVariable="
call Function.bat hello
echo MyVariable=\%MyVariable\%


Function.bat:


@echo off
rem Some code ...
set "MyVariable=\%~1"


Det kan være, at Function.bat bruger en eller anden grund kommandoen SETLOCAL . I dette tilfælde tabes alle miljøvariabler og alle ændringer, der er foretaget på miljøvariabler efter kommandoen SETLOCAL efter tilsvarende ENDLOCAL . Denne kommando kaldes implicit af Windows-kommandoprocessor ved afslutning af udførelse af en batchfil for hver SETLOCAL , der endnu ikke er afsluttet med eksplicit udførelse af tilsvarende ENDLOCAL . Læs dette svar for detaljer om kommandoerne SETLOCAL og ENDLOCAL .


Det er nødvendigt at eksplicit indstille en miljøvariabel på samme kommandolinje som kommandoen ENDLOCAL ved at bruge øjeblikkelig miljøvariabel-ekspansion til at overføre værdien af ​​en miljøvariabel fra den nuværende miljøvariabliste til tidligere miljøvariabler.


Function.bat:


@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Some code ...
set "MyVariable=\%~1"
endlocal & set "MyVariable=\%MyVariable\%"


Den sidste kommandolinje er forbehandlet først af Windows-kommandotolk til


endlocal   & set "MyVariable=hello"


Så kommandolinjen efter forbehandling indeholder ikke længere nogen variabel reference. Kommandoen ENDLOCAL gendanner tidligere miljø, hvilket resulterer i sletning af miljøvariabel MyVariable. Men den anden kommando SET , der er angivet på samme kommandolinje, sætter denne variabel igen med værdien hello i restaureret miljø.


Se også Single line med flere kommandoer ved hjælp af Windows-batchfil.