it-swarm.com.de

Übergeben Sie den Pfad mit Leerzeichen als Parameter an die bat-Datei

Ich habe ein einfaches Fledermaus-Skript, das Dateien aus einem bekannten Verzeichnis in ein vom Benutzer angegebenes Verzeichnis kopiert. Wie kann ich den Pfad (der möglicherweise Leerzeichen enthält) zu meinem Skript übergeben und ihn mit dem Befehl xcopy verwenden?


In meinem Code habe ich Folgendes

:READ_PWA_PATH
    if "%1" == "" ( 
        rem Set default path
        set PWA_PATH="C:\Program Files\PWA"
        rem
        echo You have not specified your PWA url.
        echo Default will be assumed: C:\Program Files\PWA. 
        choice /C:YN /M:"Do you wish to continue [Y] or cancel the script [N]?"
            IF ERRORLEVEL ==2 GOTO CANCEL
            IF ERRORLEVEL ==1 GOTO READ_WSS_SERVER_EXTENSIONS_PATH
        GOTO END
    ) else (
        set PWA_PATH=%1
    )

Wenn ich das Skript einfach aufrufe, erhalte ich folgende Fehlermeldung:

C:\Projects\Setup>install.cmd "C:\program files (x86)"

-----------------
SETUP SCRIPT
-----------------

files was unexpected at this time.
C:\Projects\Setup>
58
kjv

Interessantes. Ich liebe es, Zitate über die Handhabung von Anführungszeichen in cmd/command zu sammeln.

Ihre speziellen Skripte werden durch die Verwendung von% 1 anstelle von "% 1" repariert !!!

Wenn Sie ein "Echo ein" hinzufügen (oder ein "Echo aus" entfernen), hätten Sie das leicht herausfinden können.

21
vrdhn

Verwenden Sie "%~1". %~1 Allein entfernt umgebende Anführungszeichen. Da Sie jedoch nicht wissen können, ob der Eingabeparameter %1 Anführungszeichen enthält oder nicht, sollten Sie mit "%~1" Sicherstellen, dass diese sicher hinzugefügt werden. Dies ist besonders hilfreich, wenn Variablen verkettet werden, z. convert.exe "%~1.input" "%~1.output"

102
zikaS

"% ~ 1" funktioniert die meiste Zeit. Es gibt jedoch ein paar Dinge, die Sie dazu beachten müssen:

  1. Es wird in Windows NT 4.0 nicht unterstützt. Sie benötigen Windows 2000 oder höher. (Wenn Sie ein Skript codieren, das mit dem alten Betriebssystem kompatibel ist, achten Sie darauf.)
  2. Es macht Parameter nicht sicher und bereinigt. Meiner Beobachtung nach gibt es keine Möglichkeit, die Befehlszeilenargumente in CMD-Skripten ordnungsgemäß zu bereinigen.

Lassen Sie mich zur Veranschaulichung des zweiten Punktes ein Beispiel geben:

REM example.cmd
ECHO %~1

Führen Sie mit example.cmd dummy^&DIR. Das kaufmännische Und ist hier entkommen (^&), um zu verhindern, dass Shell als Befehlstrennzeichen interpretiert, sodass es Teil des an das Skript übergebenen Arguments wird. Das DIR wird als Befehl interpretiert in der Sub-Shell, in der das Skript ausgeführt wird, wo dies nicht der Fall sein sollte.

Zitat es könnte einige Zeit funktionieren, aber immer noch unsicher:

REM example2.cmd
SETLOCAL EnableExtensions EnableDelayedExpansion
SET "arg1=%~1"
ECHO "%~1"
ECHO !arg1:"=!

example2.cmd foo^"^&DIR^&^"bar wird es brechen. Der Befehl DIR wird zweimal ausgeführt, einmal direkt nach SET und einmal direkt nach dem ersten ECHO. Sie sehen, dass die "%~1" Sie denken, dass gut zitiert wird, wird durch das Argument selbst nicht zitiert.

Daher gibt es keine Möglichkeit, Argumente für die Syntaxanalyse sicher zu machen.

(BEARBEITEN: EnableDelayedExpansion funktioniert auch unter Windows NT 4 nicht. Dank der Informationen hier: http://www.robvanderwoude.com/local.php )

6
Explorer09

Wenn Sie einen Pfad mit Leerzeichen haben, müssen Sie ihn in Anführungszeichen (") setzen.

Sie sind sich nicht sicher, ob Sie genau danach fragen?

5
user7094
@echo off
setlocal enableextensions enabledelayedexpansion

if %1=="" (     
        rem Set default path
        set PWA_PATH="C:\Program Files\PWA"
        rem
        echo You have not specified your PWA url.
        echo Default will be assumed: C:\Program Files\PWA.     
        choice /C:YN /M:"Do you wish to continue [Y] or cancel the script [N]?"
                IF ERRORLEVEL ==2 GOTO CANCEL
                IF ERRORLEVEL ==1 GOTO READ_WSS_SERVER_EXTENSIONS_PATH
        GOTO END
    ) else (
        set PWA_PATH=%1
        @echo !PWA_PATH! vs. %1
        goto end
    )
:READ_WSS_SERVER_EXTENSIONS_PATH
echo ok
goto end
:CANCEL
echo cancelled
:end
echo. final %PWA_PATH% vs. %1

Wie VardhanDotNet erwähnt, ist %1 Ausreichend.

"%1%" Würde Anführungszeichen um Anführungszeichen setzen: ""c:\Program Files\xxx"" Was bedeutet:

  • 'leere Zeichenkette' (""),
  • gefolgt von 'c:\Program',
  • gefolgt von "unerwartet hier" 'Files\xxx',
  • gefolgt von einem leeren String ("")

Beachten Sie jedoch, dass Sie, wenn Sie PWA_PATH In Ihrer IF - Klausel verwenden müssen, if als !PWA_PATH! Angeben müssen (daher das enabledelayedexpansion als Beginn des Skript)

2
VonC

Wenn Ihr Pfad Leerzeichen enthält, versuchen Sie es mit %~s1. Dadurch wird das Leerzeichen entfernt und ~1 An Ihren Pfad angehängt, und was noch wichtiger ist, es bezieht sich auf den absoluten Pfad Ihrer Datei. Probieren Sie es aus.

2
Prabhu RK