Wie verwenden Sie eine Batchdatei, um eine andere Batchdatei zu erstellen, die% username% enthält

466
Ali Demir

Ich habe versucht, eine Batchdatei mit einer anderen Batchdatei zu erstellen.
Die Datei, die ich erstellen möchte, muss enthalten sein %username%, damit sie auch auf anderen Computern funktioniert.
Wenn ich es versuche, tippt es meinen tatsächlichen Benutzernamen in die Datei, was die Ausführung auf anderen Computern unmöglich macht. Kann mir bitte jemand bei meinem Problem helfen?

Folgendes habe ich in die Batchdatei geschrieben:

Echo cd c:\Users\%username%\Documents > x.bat 

Aber wenn ich x.bat öffne, heißt es:

Echo cd c:\Users\myname\Documents 

Ich weiß eigentlich, was dieses Problem verursacht, aber ich konnte keinen Weg finden, an ihm vorbei zu kommen.

2
Um eine sofortige Erweiterung zu vermeiden, verdoppeln Sie die einschließenden Prozentzeichen im generierenden Stapel mit "%% USERNAME %%" LotPings vor 5 Jahren 1
Gilt das Gleiche für% random%? Ali Demir vor 5 Jahren 0
Ja, schließen Sie ähnlich %% random %% ein LotPings vor 5 Jahren 0
% ist ein Escape-Zeichen in der Batchdatei. Verwenden Sie "%%" anstelle von "%". [Weitere Details] (http://www.robvanderwoude.com/escapechars.php). Sandeep vor 5 Jahren 0
@LotPings, warum erweitern Sie Ihren Kommentar nicht leicht als * Antwort *, da er das Problem erfolgreich löst. DrMoishe Pippik vor 5 Jahren 1

1 Antwort auf die Frage

2
LotPings

Einige clevere Leute untersuchten die inneren Abläufe von cmd.exe, die Batchdateien in dieser Fragen- und Antwortfrage von stackoverflow.com verarbeiten .

Um einem zu entkommen %, muss er verdoppelt werden
(der oben genannte Link erklärt, dass dies ein Schritt ist, der vom Batch-Parser vorzeitig rückgängig gemacht wird).

Wenn Sie wiederholt eine Variable mit einem Echo setzen und wiederholen, %müssen Sie die Verdoppelung für jeden einzelnen Schritt vornehmen, um die Erweiterung zu verzögern %-> %%-> %%%%.

Das verwandte Problem delayedexpansionhat zwei Lösungen.

  1. Setlocal EnableDelayedExpansion und Verwendung von !statt %.
    Dies ist erforderlich, wenn Sie eine Variable in einem Codeblock setzen und verwenden.
  2. Verwendung eines Pseudoaufrufs mit Set- oder Echo-Befehlen, um einen zweiten Evaluierungsdurchgang zu erzwingen.
    (um indirekt auf eine Variable zu verweisen)

Beispiele:

:: Q:\bar\2018\06\22\SU_1333415.cmd @Echo off ( Echo cd c:\Users\%username%\Documents Echo random number %random% ) >x.bat  Echo============x.bat============= type x.bat Echo= ( Echo cd c:\Users\%%username%%\Documents Echo random number %%random%% ) >y.bat  Echo============y.bat============= type y.bat Echo= Echo ========call echo============ Set bar=6 Set foo=bar Call Echo foo = %foo%, %%foo%% = %%%foo%%% Echo= Echo =====delayed expansion !=== Setlocal EnableDelayedExpansion Set bar=6 Set foo=bar Echo foo = %foo%, !foo! = !%foo%! Echo= Echo =======(code block)========== Set "Answer=n/a" ( Set /P "Answer=Enter a number: " Echo 1. the Answer is [%Answer%] Call Echo 2. the Answer is [%%Answer%%] Echo 3. the Answer is [!Answer!] ) Echo============================== 

Beispielausgabe:

20:07:57 Q:\Test\2018\06\22 > SU_1333415.cmd ===========x.bat============= cd c:\Users\LotPings\Documents random number 5680  ===========y.bat============= cd c:\Users\%username%\Documents random number %random%  ========call echo============ foo = bar, bar = 6  =====delayed expansion !=== foo = bar, bar = 6  =======(code block)========== Enter a number: 11 1. the Answer is [n/a] 2. the Answer is [11] 3. the Answer is [11] =============================