2009-03-17 16 views
5

que reciben un archivo que contiene lo siguiente:archivos por lotes: Obtener ruta absoluta

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

La cantidad de archivos en el archivo y la cantidad de directorios son variables.

Lo que necesito es solo la ruta.

\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 

Utilicé la variable %% ~ pi que funciona para todos excepto para el último. Para el último, devuelve \ cft \
Supongo que \ cft \ se devuelve cuando el programa que llama al archivo bat lo inicia desde allí.

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

¿Alguien sabe cómo puedo evitar que el archivo de compilación devuelva \ cft \? Quiero que el bate no devuelva nada cuando no hay camino.

Muchas gracias de antemano por su ayuda.

Respuesta

3

Después de hacer algunas pruebas, parece que se "%%~pi" prefijo el directorio actual a todos los elementos que no se inicia con "\".Supongo que asume que este es el caso, ya que ese sería el archivo que abriría si acaba de usar "archivo" - del mismo modo "x \ y" sería el archivo "\ x \ y".

Por ejemplo, la secuencia de comandos siguiente:

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

cuando se ejecuta en el siguiente archivo:

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

producirá (estoy en los \ Documents and Settings \ Administrador):

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

Así que la respuesta es simple. Primero detecte aquellas líneas que no comienzan con "\" y trátelas especialmente. La siguiente secuencia de comandos:

@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 su salida deseada, de la siguiente manera:

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


\ 

la setlocal/endlocal es algo que puse en la mayor parte de mis guiones hoy en día ya que evita que las variables de entorno se escape hasta un nivel y la expansión diferida es brillante (usando "!" en lugar de "%").

Puedo utilizar una variable temporal ch0 para obtener el primer carácter del archivo ("!ch0:~0,1!" es un operador de subcadena, "conseguir un carácter en la posición 0 de la variable ch0", y se puede utilizar la versión "%" así si estás no haciendo una expansión retrasada).

Luego lo comparo con "\". Si se trata de una barra inclinada, me hago eco del "%%~pi", de lo contrario, acabo de mostrar una línea en blanco según su especificación.

+0

¿Cómo puedo usar Y O en lote? if variable == 1 OR variable == 2 ( command1 command2 ) –

+0

gracias por su respuesta. Estoy probando –

+0

Entonces quiero probar si no es "! Ch0!" == "/" || "! ch0!" == "\" ( pero parece que no funciona –

0

Update2:

Como se señaló Lieven, si se puede hacer cumplir que todo comienza con "\" en su archivo test.txt, a continuación, puede utilizar este código:

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

actualización :

En realidad, después de leer su pregunta nuevamente, noté que lo que necesita es una declaración EXIST ..

FOR/F %% i en (test.txt) DO (si existe %% i echo %% ~ pi comando1 comando2)

¿Es esto lo que necesita?

mi post original ...

Cuando se llama al archivo por lotes, sólo tiene que hacer:

yourbatchfile.bat >nul 2>nul 

Cualquier cosa va a stdout y stderr (su visualización en pantalla) será canalizado a ninguna parte y no aparece Tenga en cuenta que no se generará absolutamente nada desde ese archivo por lotes ...

+0

Su enfoque actualizado no funcionará si hay un archivo llamado file6 en la ruta real. – schnaader

+0

Tienes razón. Estoy haciendo otra actualización. –

0

Parece que esto se debe a la falta de barra invertida delante del archivo6.
¿No es posible cambiar sus entradas para tener siempre una barra invertida principal?

Su entrada se convertiría entonces en

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

desafortunadamente no puedo poner la barra invertida principal. Es un archivo de salida que proviene de un servidor FTP. Hago, por ejemplo, una prueba de directorio * y me devuelve un archivo que contiene todos los archivos que comienzan con la prueba. –

+0

@vesperdolphin - Yo iría con la respuesta de schnaader entonces. –

+0

¿Cómo puedo usar Y O en lote? if variable == 1 OR variable == 2 ( command1 command2 ) –

2

puede almacenar el directorio que desea ignorar en una variable:

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

Esto funciona como se esperaba. Salida:

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

Hola, ¿qué hay en el archivo? El resultado es variable, por lo que nunca sé por adelantado qué directorios obtendré. –

+0

Tenga en cuenta que el primer FOR no lee de un archivo, simplemente analiza el directorio para el "archivo" de cadena (también podría ser "fsdjlkbfds") que da como resultado el directorio real (era "\ cft \" en su caso) entonces puede ser ignorado después. – schnaader

+0

+1. Funciona como se esperaba –

Cuestiones relacionadas