2009-03-17 4 views
5

Ich erhalte eine Datei, die Folgendes enthält:Batch-Dateien: Erhalten Sie absolute Pfad

\direcotry1\directory2\directory3\file1 
\direcotry1\file2 
\direcotry1\directory2\directory3\directory4\file3 
\direcotry1\file4 
\direcotry1\directory2\file5 
file6 

Die Menge der Dateien in der Datei und die Menge der Verzeichnisse variabel sind.

Was ich brauche, ist nur der Pfad.

\direcotry1\directory2\directory3\ for file1 
\direcotry1\ for file2 
\direcotry1\directory2\directory3\directory4\ for file3 
\direcotry1\ for file4 
\direcotry1\directory2\ for file5 
and nothing for file6 

Ich habe die Variable %% ~ pi verwendet, die für alle außer für die letzte funktioniert. Für die letzte gibt es \ cft \
Ich denke, die \ cft \ zurückgegeben wird, wie das Programm, das die bat-Datei aufruft startet es von dort.

FOR /F %%i in (test.txt) DO (
    echo %%~pi 
    command1 
    command2 
) 

Kann jemand wissen, wie ich vermeiden kann, dass die batfile zurückgibt \ cft \? Ich möchte, dass die Fledermaus nichts zurückgibt, wenn es keinen Pfad gibt.

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

3

Nach einigen Tests zu tun, scheint es, dass "%%~pi" wird das aktuelle Verzeichnis zu jedem Element Präfix, das nicht mit "\" beginnt.Ich nehme an, dass es davon ausgeht, dass dies der Fall ist, da dies die Datei wäre, die Sie öffnen würden, wenn Sie nur "Datei" verwenden würden - ähnlich "x \ y" wäre die Datei "\ x \ y".

Zum Beispiel das folgende Skript:

@echo off 
for /f %%i in (test.txt) DO (
    echo %%~pi 
) 

, wenn auf die folgende Datei ausführen:

\directory1\directory2\directory3\file1 
\directory1\file2 
\directory1\directory2\directory3\directory4\file3 
\directory1\file4 
\directory1\directory2\file5 
file6 
x\y 
\z 

produzieren (Ich bin in dem \ Dokumente und Einstellungen \ Administrator-Verzeichnis):

\directory1\directory2\directory3\ 
\directory1\ 
\directory1\directory2\directory3\directory4\ 
\directory1\ 
\directory1\directory2\ 
\Documents and Settings\Administrator\ 
\Documents and Settings\Administrator\x\ 
\ 

So ist die Antwort einfach. Erkennen Sie zuerst die Zeilen, die nicht mit "\" beginnen, und behandeln Sie sie speziell. Das folgende Skript:

@echo off 
setlocal enableextensions enabledelayedexpansion 
for /f %%i in (test.txt) DO (
    set ch0=%%i 
    set ch0=!ch0:~0,1! 
    if not "!ch0!"=="\" (
     echo. 
    ) else (
     echo.%%~pi 
    ) 
) 
endlocal 

erzeugt die gewünschte Ausgabe wie folgt:

\directory1\directory2\directory3\ 
\directory1\ 
\directory1\directory2\directory3\directory4\ 
\directory1\ 
\directory1\directory2\ 


\ 

Die setlocal/endlocal ist etwas, was ich heute in den meisten meiner Skripte setzen, da sie Umgebungsvariablen verhindert, dass ein Niveau von Leck oben und eine verzögerte Expansion ist brillant (unter Verwendung von "!" anstelle von "%").

Ich benutze eine ch0 temporäre Variable das erste Zeichen der Datei zu erhalten ("!ch0:~0,1!" ist ein Teil Operator „an einen Charakter erhalten Offset 0 von ch0 Variable“, und Sie können auch die "%" Version verwenden, wenn Sie verzögerte Expansion nicht tun).

Dann vergleiche ich es mit "\". Wenn es ein Schrägstrich ist, echo ich die "%%~pi", sonst gebe ich nur eine Leerzeile gemäß Ihrer Spezifikation.

+0

Wie kann ich AND ODER im Batch verwenden? wenn Variable == 1 OR Variable == 2 ( command1 command2 ) –

+0

danke für Ihre Antwort. Ich teste –

+0

Also ich möchte versuchen, wenn nicht "! Ch0!" == "/" || "! ch0!" == "\" ( aber es scheint nicht zu funktionieren –

0

Update2:

Als Lieven bemerkt, wenn man das alles beginnt mit "\" in der Datei test.txt erzwingen können, dann können Sie diesen Code verwenden:

@echo off 
FOR /F %%i in (test.txt) DO (
    if not "%%~pi" == "\" echo %%~pi 
) 

-Update :

Eigentlich, nach dem Lesen Ihrer Frage wieder, bemerkte ich, dass, was Sie brauchen, ist eine EXIST-Anweisung ..

FOR/F %% i in (test.txt) DO (wenn vorhanden %% i echo %% ~ pi befehl1 befehl2)

Ist das, was Sie brauchen?

Mein Original-Beitrag ...

Wenn Sie die Batch-Datei aufrufen, einfach tun:

yourbatchfile.bat >nul 2>nul 

Alles auf stdout und stderr (Ihre Bildschirmanzeige) gehen wird, wo keine geleitet werden und nicht erscheinen. Beachten Sie, dass von dieser Batch-Datei absolut nichts ausgegeben wird ...

+0

Ihr aktualisierter Ansatz funktioniert nicht, wenn im tatsächlichen Pfad eine Datei namens file6 vorhanden ist. – schnaader

+0

Sie haben Recht. Ich mache ein anderes Update. –

0

Es scheint, dass dies auf den fehlenden Backslash vor Datei6 zurückzuführen ist.
Ist es nicht möglich, Ihre Eingaben so zu ändern, dass sie immer einen umgekehrten Schrägstrich haben?

Ihre Eingabe würde dann

\directory1\directory2\directory3\file1 
\directory1\file2 
\directory1\directory2\directory3\directory4\file3 
\directory1\file4 
\directory1\directory2\file5 
\file6 
+0

kann ich leider nicht den führenden Backslash setzen. Es ist eine Ausgabedatei, die von einem FTP-Server stammt. Ich mache zum Beispiel einen Dir-Test * und es gibt mir eine Datei zurück, die alle Dateien enthält, die mit Test beginnen. –

+0

@vesperdolphin - Ich würde dann mit schnaaders Antwort gehen. –

+0

Wie kann ich AND ODER im Batch verwenden? wenn Variable == 1 OR Variable == 2 ( command1 command2 ) –

2

Sie das Verzeichnis speichern können Sie in einer Variablen ignorieren wollen:

FOR %%i in (file) do set ignoredir=%%~pi 
FOR /F %%i in (test.txt) DO (
    if not %%~pi == %ignoredir% echo %%~pi 
) 
set ignoredir= 

Dies funktioniert wie erwartet. Ausgang:

\direcotry1\directory2\directory3\ 
\direcotry1\ 
\direcotry1\directory2\directory3\directory4\ 
\direcotry1\ 
\direcotry1\directory2\ 
+0

Hallo, was ist in der Datei? Die Ausgabe ist variabel, so dass ich nie im Voraus weiß, welche Verzeichnisse ich bekommen werde. –

+0

Beachten Sie, dass das erste FOR nicht aus einer Datei liest, sondern nur das Verzeichnis nach der Zeichenkette "file" analysiert (könnte auch "fsdjlkbfds" sein), was zum eigentlichen Verzeichnis führt (in Ihrem Fall "\ cft \") so kann es danach ignoriert werden. – schnaader

+0

+1. Funktioniert wie erwartet. –

Verwandte Themen