2017-11-15 1 views
1

Ich habe ein Skript, das 3 Argumente, von denen zwei Pfade sind. Ich möchte es aus einer .bat-Datei aufrufen.direkt zitiert% ~ dp0 ignoriert Leerzeichen im Dateipfad

python myscript.py "%~dp0inputs/" "%~dp0outputs/" "foo" 

Wenn ich ein Dummy-Skript aufrufen, die einfach druckt argv die obige Zeile mit, i die erwarteten Ergebnisse zu erzielen, auch für Pfade mit Leerzeichen:

myscript.py 
C:\path\containing spaces\inputs/ 
C:\path\containing spaces\outputs/ 
foo 

aber wenn ich diese verwenden (dh% ~ DP0 für Argument 1 mit nichts anderem zwischen den Anführungszeichen):

python myscript.py "%~dp0" "%~dp0outputs/" "foo" 

dann verhält es seltsam, wenn der Pfad Leerzeichen enthält:

myscript.py 
C:\path\containing spaces" C:\path\containing 
spaces\outputs/ foo 

Es scheint, dass die Angebote nicht richtig verarbeitet wurden - was habe ich falsch gemacht?

+0

Es scheint, wie, wann immer Sie '% ~ dp0' die Zeichenfolge mit enden muss'/'für richtig verarbeitet werden. Was passiert, wenn Sie "% ~ dp0 /" 'übergeben? – derloopkat

Antwort

1

Es ist, weil die Anführungszeichen in das Python-Skript übergeben werden. Und% ~ dp0 endet mit einem \ -Zeichen.

Python Zahlen thats \ entgeht dem doppelten Zitat - Spaß.

Also "% ~ dp0" an das Skript übergeben wird als

"C:\temp\containing spaces\" 

Python behandelt, dass Hinter \ wie das Zitat zu entkommen, so dass er die Argumente übergeht.

Es sollte nicht tun - aber es tut.

Sie können das nachfolgende \ entfernen oder ein weiteres hinzufügen. Jedes dieser Werke:

python myscript.py "%~dp0/" "%~dp0outputs/" "foo" 
python myscript.py "%~dp0\" "%~dp0outputs/" "foo" 
0

versuchen, Set zu verwenden, um Ihre Pfade innerhalb des Stapels aufzurufen. (Beispiel unten)

@echo off 

set myscrpt="C:\path\containing spaces\mypythonscript.py" 
set mypath1="C:\path\containing spaces\inputs" 
set mypath2="C:\path\containing spaces\outputs" 

pushd C:\Python27 
Python %myscrpt% %mypath1% %mypath2% 
pause>NUL 
exit 
Verwandte Themen