2017-09-03 4 views
1

Ich konvertiere ein Batch-Skript in Python. Ich habe hier fest:Batch-Ausrufezeichen Variable

setlocal EnableDelayedExpansion 

for /F %%x in ('dir /B/D %OPATH%') do (
    set "FILENAME=!FILENAME! %%x" 
) 

Ich verstehe nicht, was

set "FILENAME=!FILENAME! %%x" 

tut.

Antwort

4

Normalerweise ruft %var% den Wert var ab.

Innerhalb eines code block (a parenthesised Reihe von Linien), werden %var% durch den Wert von var ersetzt werden, wenn die Anweisung, um den Block Aufruf (a for oder if) angetroffen wurde, nicht der Wert von var da es aufgrund variiert die Operation des Blocks (der run-time Wert).

Wenn delayedexpansion aufgerufen wird, kehrt %var% noch die ursprüngliche, parse-time Wert, aber !var! gibt den Wert der run-time, also in diesem Fall filename jeden Wert von %%x hat, um es als Schleifen verläuft angefügt. (Achtung: Es gibt eine Grenze von ~ 8180 Zeichen in einer Stapelvariablen [tatsächlich 8191-Länge von Variablenname])

2

Die for-Schleife verkettet alle gefundenen Dir-Einträge zu einer Zeichenfolge.

BTW das/B von Dir überschreibt das/D, so dass es weggelassen werden kann.

Auch der Standardwert für/f Optionen "tokens=1 delims= " wird Dateinamen mit Leerzeichen abgeschnitten.

Magoo erklärte die anderen Probleme gut.

1

Das Stapelscript erstellt eine durch Leerzeichen getrennte Liste der OPATH-Verzeichnisdateinamen. Es ist einfach genug, Python glob zu verwenden, um dasselbe wie eine Liste zu erhalten.

import os 
import glob 
dlist = glob.glob(os.environ['OPATH'] + os.sep + '*') 

Dies wird eine Liste von Dateinamen erzeugen. Verzeichnisnamen haben eine os.sep am Ende von ihnen. Dies könnte für Ihren Python-Code einfacher sein als eine einzelne Zeichenfolge mit Leerzeichentrennzeichen.

Wenn Sie eine durch Leerzeichen getrennte Zeichenfolge benötigen, können Sie sie problemlos verbinden.

dstring = ' '.join(dlist)