2014-05-08 27 views
13

Ich versuche, alle Backslashes() um Schrägstriche (/) in einer Variablen, die einen Dateinamen und Speicherort enthält weiterzuleiten. Ich habe darüber gelesen und gesehen:Backslash in Schrägstrich in Windows-Batch-Datei ändern

%variable:str1=str2% 

und

set "var=%var:\=/%" 

, die ich versucht habe, aber ich bin natürlich nicht alles richtig machen.

Hier ist der relevante Abschnitt meines .bat Skript:

FOR %%f IN ("E:\myfiles\app1\data\*.csv") DO (
    echo %%f 
    set "f=%%f:\=/%" 
    echo %%f 
    echo.     
) 

Die Ausgabe Show jeder Dateiname zweimal aufgeführt.

heißt dieser Zeile:

set "f=f:\=/%" 

nicht tun, was ich will es. Kann jemand sehen, was ich falsch mache?

+0

Diese Frage hat die gleiche Lösung (http [Wie Sie die Benutzername in FTP-Upload von einer Batch-Datei angeben]://stackoverflow.com/questions/23535640/how-do-you-specify-the-username-in-ftp-upload-by-a-batch-file) – jeb

+0

Sind Sie sicher, dass die Lösung in der Frage enthalten ist, mit der Sie verknüpft sind ? Ich sehe die Antwort nicht und sie sehen für mich wie verschiedene Fragen aus. – user3253319

+0

Entschuldigung, Sie haben Recht. Ich meinte [BATCH - Leerzeichen im Dateinamen mit% 20 für curl ersetzen] (http://stackoverflow.com/questions/23538894/batch-erplacing-spaces-in-filename-with-20-for-curl) – jeb

Antwort

15

Innerhalb einer Blockanweisung (a parenthesised series of statements), das ist gesamte Block analysiert und dann ausgeführt. Jede %var% innerhalb des Blocks wird durch den Wert dieser Variablen zum Zeitpunkt der Analyse des Blocks ersetzt - vor der Blockausführung - das gleiche gilt für eine FOR ... DO (block).

Daher wird IF (something) else (somethingelse) mit den Werten von %variables% zum Zeitpunkt IF ausgeführt.

Zwei allgemeine Wege, dies zu überwinden, sind 1) zu verwenden und setlocal enabledelayedexpansion!var! anstelle von %var% verwenden den geänderten Wert von var oder 2) für den Zugriff auf ein Unterprogramm aufrufen weitere Verarbeitung auszuführen, um die geänderten Werte verwenden.

Beachten Sie daher die Verwendung von CALL ECHO %%var%%, die den geänderten Wert var anzeigt.

Ihr Code enthält zwei separate Variablen mit der Bezeichnung f.

Die erste ist die "Metavariable" der Schleifensteuerung f genannt und referenziert durch %%f.

Die zweite ist die gemeinsame Umgebungsvariable f, die durch die set "f=..."-Anweisung festgelegt wird.Diese Variable kann mit %f%aber innerhalb eines block zugegriffen werden kann, wird es den Wert, den es hatte zu behalten erscheinen, wenn die Steuerung for (in der Tat analysiert wurde, jede %var% bei Parse-Zeit durch den Wert von varan, dass ausgetauschte Zeit)

metavariables kann nicht in String-Manipulation Aussagen wie Substrings oder Ersatzstoffe verwendet werden, nur gemeinsame Umgebungsvariablen für diese Operationen verwendet werden können, daher müssen Sie den Wert des Metavariable f der Umgebungsvariablen f und zuweisen dann führen Sie die String-Substitution Aufgabe von die Umgebungsvariable f.

Der Twist ist natürlich, dass Sie delayedexpansion und die !var! Syntax verwenden müssen, um auf den geänderten Wert einer Umgebungsvariablen innerhalb eines Blocks zuzugreifen.

So

setlocal enabledelayedexpansion 
for...%%f...do (
    echo %%f 
    set "f=%%f" 
    set "f=!f:\=/!" 
    echo !f! 
) 
echo just for demonstration %f% !f! %%f 

Dieser Wert von f in der erforderlichen Weise setzt (natürlich können Sie immer den Namen Verwirrung zu vermeiden, ändern ...)

Die letzte Zeile ist einfach zu Zeigen Sie, dass der von f erfasste Endwert außerhalb der Schleife als %f% oder !f! abgerufen werden kann und dass %%f außerhalb des Kontexts liegt und als %f angezeigt wird.

Ein anderer Weg, dies ohne delayedexpansion zu tun ist,

for...%%f...do (
    echo %%f 
    set "f=%%f" 
    call set "f=%%f:\=/%%" 
    call echo %%f%% 
) 
echo just for demonstration %f% !f! %%f 

der Unterschied die Verwendung von call zu sein und die % s verdoppelt, und die letzte Zeile !f! wie genau das zeigen wird - eine wörtliche, da außerhalb von delayedexpansion Modus, ! ist nur ein weiteres Zeichen ohne besondere Bedeutung zu cmd.

+1

wow, eine sehr umfassende Erklärung, vielen Dank! Ich musste es ein paar Mal lesen, aber ich denke ich bekomme es .. !! Windows-Batch-Skript sieht immer noch wirklich seltsam zu mir, ich bin mir nicht sicher, ob ich jemals wirklich "bekomme" – user3253319

+0

Ich musste eigentlich das Gegenteil tun: Ersetzen Sie Schrägstrich mit Backslash, aber Ihre Erklärung war perfekt. –

4

Das ist für mich scheint zu funktionieren:

echo off 

setlocal enabledelayedexpansion 

FOR %%f IN ("C:\tools\workspace\*") DO (
    set old=%%f 
    echo !old! 
    set new=!old:\=/! 
    echo !new! 
    echo.     
) 

eher eine separate Variable als die Schleifenvariable den Unterschied, zusammen mit der Aktivierung verzögert Expansion als die Variable substittion syntex mit der Schleifenvariable %% f dosn‘macht Es scheint zu funktionieren.

+0

brilliant, ja das funktioniert, Prost! – user3253319

32

Dies wird die Back-Schrägstriche ändern, um zukunftsSchrägStriche in einer Variablen:

set "variable=E:\myfiles\app1\data\*.csv" 
set "variable=%variable:\=/%" 
echo "%variable%" 
+0

Danke. Sehr kurz und niedlich .. – user8162

+0

Diese Antwort funktioniert perfekt ohne die Notwendigkeit einer Schleife. Ich habe es gerade selbst ausprobiert (ich brauchte die Zitate allerdings nicht). – ThePersonWithoutC

+2

Dank @ThePersonWithoutC - die Anführungszeichen schützen bestimmte Gift-Zeichen wie '&' und machen es nur für ungewöhnliche Situationen robuster. – foxidrive