2016-07-31 13 views
1

Ich versuche, ein sehr einfaches Batch-Skript zu schreiben, die auf eine andere Batch-Datei echo, um die Dinge organisiert zu halten. Während dies zu tun, bemerkte ich, dass, wenn ich etwas tue, wie:Wie zu entkommen %%

@echo if %cd%==C:\Users\whoever\Desktop msg * success 

dann wäre es das aktuelle Verzeichnis Echo, da ich „% cd%“ put in. Wie würde ich dies entkommen, so dass es statt echo% cd%, eher dann: C:\Users\whoever\desktop\file

Vielen Dank für die Hilfe!

+1

Ich glaube, Sie sollten einfach %% verwenden, um ein einzelnes% zu vermeiden, um zu verhindern, dass es interpretiert wird. – codechurn

+0

@codechurn Es sei denn, die '%%'-Prozente sind um einen vorhandenen Variablennamen herum. Versuchen Sie 'echo" %% cd %% "zu sehen, warum die Problemumgehungen in der Antwort, die ich gepostet habe, in diesen Fällen notwendig sind. – dxiv

+2

@dxiv das Problem tritt nur an der Befehlszeile, in Batch-Dateien die Verdoppelung ist genug – jeb

Antwort

3

Entkommen sein ein bisschen nicht intuitiv.

in Batch-Dateien, % mit einem anderen % entkommen: echo %%cd%%

auf der Kommandozeile können Sie sie nicht wirklich entkommen können, aber „fake-Flucht“, um sie mit einem Caret: echo ^%cd^% funktioniert der Trick, weil cmd%varName% zeigt, Wenn varname nicht definiert ist, zeigt der Versuch, die nicht definierte Variable cd^ anzuzeigen stattdessen %cd% (der Parser schluckt das Caret). Der Startcaret ist nicht wirklich notwendig, macht aber das "Fake-Escaping" konsistenter.

C:>@echo if ^%cd^%==C:\Users\whoever\Desktop msg * success 
if %cd%==C:\Users\whoever\Desktop msg * success 
C:>type t.bat 
@echo if %%cd%%==C:\Users\whoever\Desktop msg * success 
C:>t 
if %cd%==C:\Users\whoever\Desktop msg * success 
C:> 
+0

In Wirklichkeit kann es in der Befehlszeile nicht maskiert werden. Die Carets entgehen den Prozentzeichen nicht, das einzige erzeugt einen undefinierten Variablennamen, wie 'cd ^' – jeb

+0

@jeb: in der Tat ... (nett zu wissen). Trotzdem - es funktioniert wie beabsichtigt (bis die Variable definiert wird (unwahrscheinlich - wer würde einen Caret als Teil eines Variablennamens verwenden? (Rhetorische Frage ...))) – Stephan

+0

Vielen Dank! Dies hat eine Tonne geholfen! – Silver

2

Ich weiß nicht, von einem eleganten Einzeiler, aber folgendes funktioniert:

@echo off 
set "random=cd" 
echo %%%random%%% = "%cd%" 
set "random=" 

Ausgang:

%cd% = "C:\Users\whoever\desktop\file" 

Beachten Sie, dass die temporäre Variable tut nicht sein müssen genannt random, nur weil es ein reservierter Name ist, sind die Chancen niedriger, dass es eine andere definierte Variable überschreiben würde.


[EDIT] Eine Alternative, falls das Konstrukt wiederholt verwendet wird, wird die folgende wäre (auf Kosten einer dedizierten Umgebung der Verwendung variabler pct): kann

@echo off 
set "pct=%%" 
echo %pct%cd%pct% = "%cd%" 
+0

Verwenden reservierter Namen ist eine schlechte Idee, wie Sie das * normale * Verhalten ändern, in diesem Fall funktioniert die zufällige Funktionalität nicht mehr. BTW die extra Variable ist hier nicht notwendig. Ihre * pct * Verwendung ist nur in der Befehlszeile erforderlich, aber dort ist es sicherer als die Caret-Lösung – jeb

+0

Danke! Ich schätze all die Hilfe! – Silver

+0

@jeb 'in diesem Fall funktioniert die Zufallsfunktionalität nicht mehr. Es wird nur temporär verwendet, und das gepostete Beispiel definiert es in der nächsten Zeile' set' random = "' genau aus dem Grund, den du erwähnst. – dxiv