2009-03-17 20 views
5

ricevo un file che contiene quanto segue:file batch: ottenere il percorso assoluto

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

La quantità di file nel file e la quantità di directory sono variabili.

Quello che mi serve è solo il percorso.

\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 

Ho usato la variabile %% ~ pi che funziona per tutti tranne che per l'ultimo. Per l'ultimo restituisce \ cft \
Immagino che \ cft \ venga restituito mentre il programma che sta chiamando il file bat lo avvia da lì.

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

Qualcuno sa come posso evitare che il batfile ritorni \ cft \? Voglio che il pipistrello non restituisca nulla quando non c'è percorso.

Grazie mille in anticipo per il vostro aiuto.

risposta

3

Dopo aver fatto qualche test, sembra che "%%~pi" sarà anteporre la directory corrente per ogni elemento che non inizia con "\".Capisco che questo è il caso dato che quello sarebbe il file che avresti aperto se hai appena usato "file" - allo stesso modo "x \ y" sarebbe il file "\ x \ y".

Ad esempio, il seguente script:

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

quando viene eseguito il seguente file:

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

produrrà (sono nella cartella \ Documents and Settings \ Administrator):

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

Quindi la risposta è semplice. Rileva prima quelle linee che non iniziano con "\" e trattale in modo speciale. Il seguente script:

@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 

genera l'output desiderato, come segue:

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


\ 

Il setlocal/endlocal è qualcosa che ho messo nella maggior parte dei miei script al giorno d'oggi in quanto impedisce variabili d'ambiente fuoriuscita di un livello e l'espansione ritardata è brillante (utilizzando "!" anziché "%").

Io uso una variabile temporanea ch0 per ottenere il primo carattere del file ("!ch0:~0,1!" è un operatore di sottostringa, "ottieni un carattere all'offset 0 della variabile ch0", e puoi usare anche la versione "%" se sei non facendo espansione ritardata).

Quindi lo paragono a "\". Se si tratta di una barra, faccio eco allo "%%~pi", altrimenti ho appena emesso una riga vuota secondo le specifiche.

+0

Come posso utilizzare AND OR in batch? se variabile == 1 OR variabile == 2 ( comando1 comando2 ) –

+0

grazie per la risposta. Sto testando –

+0

Quindi voglio provare se non "! Ch0!" == "/" || "! ch0!" == "\" ( ma non sembra funzionare –

0

Update2:

Come osservato Lieven, se è possibile applicare che tutto inizia con "\" nel file test.txt, quindi è possibile utilizzare questo codice:

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

Aggiornamento :

In realtà, dopo aver letto di nuovo la tua domanda, ho notato che quello di cui hai bisogno è un'espressione EXIST ..

FOR/F %% i in (test.txt) DO (se esiste %% i echo %% ~ pi comando1 comando2)

È questo ciò che ti serve?

mio post originale ...

Quando si chiama il file batch, semplicemente:

yourbatchfile.bat >nul 2>nul 

qualche cosa che va a stdout e stderr (il display dello schermo) sarà convogliato a nessun dove e non appare. Si noti che assolutamente nulla verrà emesso da quel file batch ...

+0

L'approccio aggiornato non funzionerà se nel percorso corrente è presente un file denominato file6. – schnaader

+0

Hai ragione. Sto facendo un altro aggiornamento. –

0

Sembra che ciò sia dovuto alla barra rovesciata mancante di fronte a file6.
Non è possibile modificare gli input per avere sempre una barra retroversa?

Il vostro contributo sarebbe poi diventato

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

sfortunatamente non riesco a mettere il backslash principale. È un file di output proveniente da un server FTP. Faccio ad esempio un dir test * e mi restituisce un file che contiene tutti i file che iniziano con il test. –

+0

@vesperdolphin - Allora andrei con la risposta di Schnaader. –

+0

Come posso utilizzare AND OR in batch? se variabile == 1 OR variabile == 2 ( comando1 comando2 ) –

2

È possibile memorizzare la directory che si desidera ignorare in una variabile:

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

Questo funziona come previsto. Uscita:

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

Salve cosa c'è nel file? L'output è variabile, quindi non so mai in anticipo quali directory otterrò. –

+0

Si noti che il primo FOR non legge da un file, ma solo la directory per la stringa "file" (potrebbe anche essere "fsdjlkbfds") che risulta nella directory effettiva (era "\ cft \" nel tuo caso) quindi può essere ignorato in seguito. – schnaader

+0

+1. Funziona come previsto. –

Problemi correlati