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.
@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:\>
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.
)
)
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
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
)
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
: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
@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:\>
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! ;-)
Sí, sólo tiene ese aplicación.
exit /b "Error level a devolverle al sistema operativo"
Ok, gracias, vere si le saco utilidad ;D
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:
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.