Cómo diferenciar un directorio de un archivo

Iniciado por <ИΘZIЭ(ŦB>, 25 Agosto 2009, 05:12 AM

0 Miembros y 2 Visitantes están viendo este tema.

<ИΘZIЭ(ŦB>

Buenas noches compañeros. Bueno, no sé que horario tengan uds, pero aquí es de noche. Saludos.

Quisiera saber si los archivos y directorios tienen agún identificador que los diferencie entre sí, de modo que se pueda verificar a través de un .bat.

Tengo un .bat que pide al usuario definir la ruta de un directorio o archivo, para luego almacenar ese valor en una variable. Lo que necesito ahora es poder saber si la ruta se trata de un archivo o un directorio, pero no sé cómo. Se me ocurrió verificar si la ruta tenía extensión, ya que así sabría que se trata de un archivo, pues los directorios no tienen extensión. No obstante, recordé que hay muchos archivos que tampoco tienen extensión, así que no lo intenté.

Así pues, consideré necesario acudir una vez más a uds a ver si me ayudan. Se los agradezco de antemano.

leogtz

Código (dos) [Seleccionar]
@echo off
if ["%~1"]==[""] exit /b 0
call:know %~1
echo %var% | find /i "d" > nul 2>&1 && (
echo Folder
) || (
echo File
)
goto:Eof
:know
set "var=%~a1"
goto:eof



C:\>code.bat code.bat
File

C:\>code.bat c:\windows
Folder

C:\>code.bat c:\windows\system32
Folder

C:\>code.bat c:\windows\system32\cmd.exe
File

C:\>code.bat file.txt
File

C:\>code.bat "c:\documents and settings"
Folder

C:\>
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

0x0309

con if y agregas un \ al final

Por ejemplo si tu carpeta se llama:
nueva carpeta


if exist "nueva carpeta\" (echo. Es carpeta) else (
if exist "nueva carpeta" (echo.Es archivo) else (
echo.No existe.
)
)

kevlar

Saludos


Puedes probar con un simple CD RUTA

Si la ruta es un archivo, entonces la variable %ERRORLEVEL% nos arrojaá un 1

De lo contrario si efectua el CD correctamente nos arroja 0 (cero)


F:\Armando>cd semana.bat
El nombre del directorio no es válido.

F:\Armando>echo %ERRORLEVEL%
1

F:\Armando>cd APPS

F:\Armando\APPs>echo %ERRORLEVEL%
0



;D

leogtz

El problema aquí es que podrías no tener permisos para acceder a ese directorio.

Pero podría funcionar.

cd /d "ruta" && (
echo Directorio
cd..
) || (
echo Archivo
)
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

0x0309

#5
Miren, probé el código de Leo, no funciona bien porque:
por ejemplo:


C:\>code.bat c:\pagefile.sys
Folder


Se podría usar attrib, pero el problema es que attrib no muestra el atributo de directorio, usando una lógica similar a la de Leo de ver los atributos usando for que se expanden más o menos así si son un archivo:
---------
si son un directorio:
d--------
si no existen:



pero el problema es que con archivos especiales, como el pagefile.sys el for expande como si no existiera.

hice este código más rebuscado, con validaciones:


@echo off

call :isFolder "%~1"
if errorlevel 0 if not errorlevel 1 (echo.Es archivo)
if errorlevel 1 if not errorlevel 2 (echo.Es directorio)
goto :eof

:isFolder
setlocal enableextensions enabledelayedexpansion
(set n=%~1)
if not defined n (
echo.No se paso ningun parametro.
exit /b 2
)
for %%_ in ("!n!") do set "atr=%%~a_#"
if "#"=="!atr!" (
echo.No se encuentra el archivo o directorio.
exit /b 3
) else (
set i=0
if "!atr:~0,1!"=="d" (set i=1)
)
exit /b %i%



que produce:

C:\>tipo.bat "c:\Archivos de programa"
Es directorio

C:\>tipo.bat "c:\AUTOEXEC.BAT"
Es archivo

C:\>tipo.bat "c:\pagefile.sys"
No se encuentra el archivo o directorio.


si se fijan el pagefile dice que no se encuentra, así es que a mí parecer la mejor forma es la que había puesto en el post anterior:


C:\>if exist "c:\pagefile.sys\" (echo.es directorio) else (
¿Más? if exist "c:\pagefile.sys" (echo.es archivo) else (
¿Más? echo.no existe ))
es archivo



Así es que este código está a prueba de balas.

atr.bat
Código (dos) [Seleccionar]

:funAtr
setlocal enableextensions
set /a t=0
if exist "%~1\" (set /a t=1
) else if exist "%~1" (set /a t=2)
exit /b %t%


que devuelve en errorlevel 0 si no existe, 1 si es directorio y 2 si es archivo.
Así que si lo llaman desde otro archivo:

test.bat
Código (dos) [Seleccionar]

@echo off
call atr.bat "%~1"
if errorlevel 0 if not errorlevel 1 (echo.No existe)
if errorlevel 1 if not errorlevel 2 (echo.Es directorio)
if errorlevel 2 if not errorlevel 3 (echo.Es archivo)


que produce:

C:\>test.bat "c:\Archivos de programa"
Es directorio

C:\>test.bat "c:\AUTOEXEC.BAT"
Es archivo

C:\>test.bat "c:\pagefile.sys"
Es archivo

C:\>test.bat c:\dfdsgsfdgfdhfd
No existe

C:\>




xassiz_

Una cosa 0x0309, que diferencia hay entre estas cosas:


exit /b



exit /b 0



exit /b %t%



Supongo que deja el errorlevel en lo que viene a continuacion del  /b

code.bat

echo.exit /b + errorlevel
echo.
exit /b 69


file.bat

@echo off
call code.bat
echo.Errorlevel: %errorlevel%
pause>nul
exit



Comprobado, lo acabo de aprender gracias a tu code ;D

Pero de todas formas, solo tiene esa aplicacion?


Gracias de nuevo 0x! ;-)



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

leogtz

Sí, sólo tiene ese aplicación.
exit /b "Error level a devolverle al sistema operativo"
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

xassiz_




YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

<ИΘZIЭ(ŦB>

Disculpen mi auscencia. No recordaba este tema.
Gracias a todos por su interés. De verdad me ha servido de mucho.

Sin embargo, ya llevo tiempo usando este método que me parece bastante cómodo:

Código (dos) [Seleccionar]
set "file=Nombre_archivo"
For %%T in ("%file%") do (set "att=%%~aT")
echo %att% | find "a" >nul
If %errorlevel% == 0 echo Es archivo
If %errorlevel% == 1 echo Es carpeta


Gracias a todos.