2017-01-26 5 views
0

Ich brauche einen Batch-Skript aufgerufen werden alsBatch-Skript - Set/Umgebungsvariable definieren, wenn nicht bereits gesetzt/definiert

SetEnvironmentVariableIfNotSet.bat environment_variable_name <value> 

aus einem anderen Skript oder die Befehlszeile.

Ich bin auf keinen Fall Spezialist für Windows-Batch-Scripting aber durch Versuch und Irrtum und verschiedene Dinge zusammen Ansetzen, bisher habe ich kam mit dieser:

@setlocal EnableDelayedExpansion 
@if "!%1!"=="" (
    echo '%1' undefined. Defining with value 
    echo %2 
    endlocal DisableDelayedExpansion 
    goto :define_variable 
) else (
    echo '%1' already defined with value 
    echo !%1! 
    endlocal DisableDelayedExpansion 
    goto :eof 
) 

:define_variable 
@set "%1=%2" 

Wenn sie aufgerufen wird, das tut, was ich brauche:

C:\>call DefEnvVarIfNotDef.bat ASD "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" 
'ASD' undefined. Defining with value 
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" 
C:\>echo %ASD% 
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" 

Hier nach einer besseren/optimalen Lösung fragen. Das sieht mir sicher hässlich aus.

+1

'wenn nicht% 1 Satz "% 1 =% 2"' definiert? Nur aus Neugier: Warum brauchst du so etwas? Warum nicht einfach angeben, wenn ASD nicht definiert ist ASD = "C: \ Programme (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ devenv.exe" '? – aschipfl

+0

@aschipfl: Das aufrufende Skript läuft in verschiedenen Umgebungen; manchmal existieren die Variablen (vollständig oder unvollständig); In anderen Fällen sind keine vorhanden. Ich dachte, es wäre albern, einfach das "if" ASD "==" "..." zu wiederholen; plus mit dem Scriptlet bekomme ich auch aus was übernommen wird und was ausgefüllt ist – CristiArg

Antwort

2

könnten Sie verwenden nur If Defined oder If Not Defined:

@Echo Off 
If "%~1"=="" GoTo :EOF 
If Defined %~1 (
    Echo='%~1' already defined with value 
    Call Echo=%%%~1%% 
    Pause 
    GoTo :EOF 
) 
If "%~2"=="" GoTo :EOF 
Echo='%~1' undefined, defining with value 
Echo=%~2 
Set "%~1=%~2" 
Pause 
+0

Danke für den "% ~ 1" Tipp. Ich habe nichts davon gewusst. Ich brauchte es, um mit zu arbeiten: unquoted blanc-less Werte; zitierter leerer Wert (Aufruf mit "blankless-value"); zitierte Werte mit blancs drin (MS's dumme Wege) – CristiArg

Verwandte Themen