Wie Sie eine CMD-shell-variable zweimal (rekursiv)
Mithilfe der Windows XP-CMD-command line kann ich erweitern eine variable zweimal wie folgt:
set AAA=BBB
set BBB=CCC
for /F "usebackq tokens=*" %i in (`echo %%AAA%%`) do echo %i
echo CCC
. I. e. AAA
wurde erweitert, um die Zeichenfolge BBB
, und dann die variable BBB
wurde erweitert, um CCC
.
Dies nicht funktioniert, von innen ein batch-Skript (also eine .cmd-Datei). Ändern der %%AAA%%
entweder %%%AAA%%%
oder %%%%AAA%%%%
funktioniert auch nicht.
Irgendeine Idee, wie ich erreichen kann das in einem Skript nämlich erweitern Sie die variable AAA bis die Zeichenfolge CCC?
Spät Bearbeiten
Den Antworten für mein Beispiel reduziert jedoch die nicht-gewundene Antwort, die nicht arbeiten, für den Ernstfall. Hier ein erweitertes Beispiel (was nicht funktioniert), das illustriert, was ich eigentlich machen willst:
setlocal enabledelayedexpansion
set LIST=BBB CCC DDD
set BBB=111
set CCC=222
set DDD=333
for %%i in (%LIST%) do (
for /F %%a in ('echo %%%i%') do echo !%%a!
)
Ich würde gerne sehen,
111
222
333
Ausgabe.
Kann nicht mit der PowerShell, noch nicht zumindest.
Ist nicht Ihre Anweisung Die Antworten für mein Beispiel reduziert jedoch die nicht-gewundene Antwort, die nicht arbeiten, für den Ernstfall, die im Widerspruch mit Ihrem Kommentar zu akf's post Danke, diese beiden tun Sie tatsächlich funktioniert.?
Nur, wenn Sie nicht berücksichtigt wird der Zeitpunkt, zu dem die Kommentare und Aussagen wurden gemacht.
Ok. Wenn Strom Antworten tun, Ihre Frage zu beantworten wäre es schön, zu reflektieren, diese Tatsache durch die Aktualisierung Ihrer Bemerkung in die Frage. Aktuellen Zustand ist verwirrend.
InformationsquelleAutor jon-hanson | 2009-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denken in Bezug auf eine weniger qualvolle Lösung, auch dies erzeugt die
CCC
Sie wünschen.edit:
sezieren diese Antwort:
setlocal enabledelayedexpansion
- dies ermöglicht es für jede Umgebung variable Einstellung während Ihre Schläger verwendet werden, da änderungen während der Bearbeitung Ihrerfor
Schleife.set AAA=BBB
,set BBB=CCC
- Ihre Daten Bevölkerungset
Aussagenfor /F %%a in ('echo %AAA%') do echo !%%a!
- Das zeigt die Prozessor-Schleife, wenn auch nur einmal, und nehmen Sie die erste token zurückgegeben wird (default-Trennzeichen Leerzeichen und tab gelten) von der Ausführung von dem Befehl in den Klammern und legen Sie es in die var %%a (außerhalb einer charge, einem einzigen % tun wird). Wenn Sie angeben, dass var als %%ein, müssen Sie die Verwendung von %%a in Ihrerdo
block. Ebenso, wenn Sie geben Sie %%i %%i in Ihredo
block. Beachten Sie, dass, um Ihre environment-variable gelöst werden, innerhalb derdo
block derfor
Schleife, die Sie brauchen, die Sie umgeben in!
's. (Sie brauchen nicht zu in derin
block, als ich ursprünglich gepostet - ich gemacht haben, dass Veränderung in meinem edit).edit:
Sie waren sehr eng mit Ihr aktualisiertes Beispiel. Versuchen Sie es so:
Den Unterschied zwischen update und das ist, dass Sie versuchen würden, echo die Umgebungsvariablen in der
in
set mitin ('echo %%%i%')
, aber ohne die!
's für die verzögerte Erweiterung von Variablen festlegen. Waren, die Sie verwendenin ('echo !%%i!')
, würden Sie sehen, IhreBBB
,CCC
, undDDD
Variablen gelöst, aber dann derdo
block der inneren Schleife würde nicht haben, etwas zu beheben - Sie haben noch keine111
Umgebungsvariablen. Mit dem im Verstand, könnte man vereinfachen Sie Ihre Schleife, mit der folgenden:Ich bin mir nicht sicher, dass ich Folgen, was Sie sagen. Bei der Verwendung des var eines
for
Schleife in eine Fledermaus, die doppelten % sollte den trick tun. Ich verwendet %%ein, das wäre das gleiche wie %%i in deinem Beispiel. Vielleicht könnten Sie Ihre spezifischeren Beispiel in der Frage.Ich habe ein weiteres Beispiel zu der Frage.
Danke. Bitte siehe meine edits.
Danke, beide funktionieren. Ich muss zugeben, nach Jahren des Schreibens ziemlich fortgeschrittenen UNIX-bash-Skripten, schreiben von Windows-cmd-Skripts wurde eine schmerzhafte übung. Die unzähligen Möglichkeiten der Erweiterung von Variablen ("%A, %%A, %A%, !%A%!, etc) ist unverständlich. Die enabledelayedexpansion fahne um die situation zu verbessern, aber es aus unerklärlichen Gründen macht bestimmte Teile meines Skripts unbrauchbar. Ich denke, PowerShell ist die Zukunft...
InformationsquelleAutor akf
Wie Sie eine shell-variable mehrfach:
Ausgabe:
Ich mag dieses besser. Ich bin auch kicken mich, weil ich verwenden eine ähnliche Technik, tor zurückgeben von Zeichenfolgen aus
.cmd
und.bat
- Dateien. Allerdings fand ich eine Falte. Die Erweiterung: "b:\lang\java\jre\v10.00
" ==> "\lang\java\jre\v10.00
". Ich löse das "b:
" Laufwerk zuzuweisen. Hat jemand eine Erklaerung? Ich habe nicht in der Lage zu bekommen, um, Es ist der Doppelpunkt(:
). z.B. "abc:xyz
" ==> "xyz
" und . "abc:xyz:1234
" ==> "1234
". Doppelpunkt ist uesd für string-substitution. Sonst funktioniert gut.InformationsquelleAutor Piotr Dobrogost
Folgende (qualvoll) Ansatz scheint zu funktionieren:
It-Ausgänge:
wie gewünscht.
Habe ich oft verwendet diesen trick, um (zum Beispiel) format
%aaa%
in%x%
zu einer bestimmten Größe (a lasprintf
), aber dies ist das erste mal habe ich Sie doppelte Dereferenzierung. Es funktioniert, weil Sie nicht finden, die extra"%%"
angesaugt durch die aktuelle shell-Ebene.%%
haben Sie im Auge?InformationsquelleAutor paxdiablo
Diese aaa.bat
Ausgänge
Was genau ist das Problem?
Ich habe versucht, obige Skript unter Vista nach dem Wechsel
aaa
zuAAA
undbbb
zuBBB
und der Ausgang istccc
.Ich war mit XP damals
Bekomme ich die gleiche Ausgabe für XP SP3 als auch.
InformationsquelleAutor wqw
Dies ist eine etwas veraltet, Frage, aber, interessanterweise, die Antwort ist einfacher jetzt. Ich bin mit diesen Skripten auf Windows 10:
Ausgänge
Für die erweiterte version, das funktioniert:
Ausgänge
InformationsquelleAutor Stephen Quan
Doppelten Dereferenzierung (das ist eine sehr treffende Art und Weise
pax
es formuliert hat) erinnert an C-pointer de-Referenzierung.Ich bezweifle, dass unterstützt die Windows-Befehls-shell.
Glaubst du, der größere Zweck, die Ihr Ziel erreicht werden kann, mit etwas einfacher;
vielleicht weniger von einem code-golf Ansatz, dann ist das ein künstlich schön durch
pax
?InformationsquelleAutor nik
es scheint, wie die einfachste Sache zu tun ist, erstellen Sie eine kleine temp-Datei die variable setzen, wie Sie möchten. so etwas wie dies funktionieren sollte:
InformationsquelleAutor james turner