Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: <ИΘZIЭ(ŦB> en 25 Agosto 2009, 05:12 am



Título: Cómo diferenciar un directorio de un archivo
Publicado por: <ИΘZIЭ(ŦB> en 25 Agosto 2009, 05:12 am
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.


Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: leogtz en 25 Agosto 2009, 06:21 am
Código
  1. @echo off
  2. if ["%~1"]==[""] exit /b 0
  3. call:know %~1
  4. echo %var% | find /i "d" > nul 2>&1 && (
  5. echo Folder
  6. ) || (
  7. echo File
  8. )
  9. goto:Eof
  10. :know
  11. set "var=%~a1"
  12. goto:eof
Código:

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:\>


Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: 0x0309 en 25 Agosto 2009, 08:27 am
con if y agregas un \ al final

Por ejemplo si tu carpeta se llama:
nueva carpeta

Código:
if exist "nueva carpeta\" (echo. Es carpeta) else (
if exist "nueva carpeta" (echo.Es archivo) else (
echo.No existe.
)
)


Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: kevlar en 27 Agosto 2009, 16:23 pm
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


Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: leogtz en 27 Agosto 2009, 17:22 pm
El problema aquí es que podrías no tener permisos para acceder a ese directorio.

Pero podría funcionar.

Código:
cd /d "ruta" && (
echo Directorio
cd..
) || (
echo Archivo
)


Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: 0x0309 en 2 Septiembre 2009, 05:25 am
Miren, probé el código de Leo, no funciona bien porque:
por ejemplo:

Código:
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:
Código:
---------
si son un directorio:
Código:
d--------
si no existen:
Código:


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:

Código:
@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ódigo:
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ódigo:
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
  1. :funAtr
  2. setlocal enableextensions
  3. set /a t=0
  4. if exist "%~1\" (set /a t=1
  5. ) else if exist "%~1" (set /a t=2)
  6. exit /b %t%
  7.  

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
  1. @echo off
  2. call atr.bat "%~1"
  3. if errorlevel 0 if not errorlevel 1 (echo.No existe)
  4. if errorlevel 1 if not errorlevel 2 (echo.Es directorio)
  5. if errorlevel 2 if not errorlevel 3 (echo.Es archivo)
  6.  

que produce:
Código:
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:\>




Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: xassiz_ en 2 Septiembre 2009, 18:21 pm
Una cosa 0x0309, que diferencia hay entre estas cosas:

Código:
exit /b

Código:
exit /b 0

Código:
exit /b %t%


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

code.bat
Código:
echo.exit /b + errorlevel
echo.
exit /b 69

file.bat
Código:
@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! ;-)


Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: leogtz en 3 Septiembre 2009, 04:06 am
Sí, sólo tiene ese aplicación.
Código:
exit /b "Error level a devolverle al sistema operativo"


Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: xassiz_ en 3 Septiembre 2009, 11:43 am
Ok, gracias, vere si le saco utilidad ;D


Título: Re: Cómo diferenciar un directorio de un archivo
Publicado por: <ИΘZIЭ(ŦB> en 23 Junio 2010, 22:02 pm
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
  1. set "file=Nombre_archivo"
  2. For %%T in ("%file%") do (set "att=%%~aT")
  3. echo %att% | find "a" >nul
  4. If %errorlevel% == 0 echo Es archivo
  5. If %errorlevel% == 1 echo Es carpeta
  6.  

Gracias a todos.