ver - ¿Cómo probar si una ruta es un archivo o directorio en el archivo por lotes de Windows?
mostrar mensaje en pantalla cmd (5)
Busqué aquí, encontré a alguien usando esto
set is_dir=0
for %%i in ("%~1") do if exist "%%~si"/nul set is_dir=1
pero no funcionó, cuando %1==c:/this is a file with spaces.csproj
, ¡la prueba sigue siendo exitosa, lo que significa que todavía se tratará como una carpeta!
cualquiera sabe la respuesta, supongo que este es un problema muy común y Windows ha existido por muchos años, debería tener una solución muy simple ...
Lo intenté de esta manera. Espero que esto ayude.
@ECHO OFF
SET CURR_DIR=%CD%
SET IS_DIR=0
CD %1%
IF "%ERRORLEVEL%"=="0" SET IS_DIR=1
CD %CURR_DIR%
ECHO IS DIRECTORY %IS_DIR%
Salida:
D:/Work/Stand alone Java classes>test.bat D:/Work/Training
IS DIRECTORY 1
D:/Work/Stand alone Java classes>test.bat D:/Work/Training/SRT.txt
The directory name is invalid.
IS DIRECTORY 0
La opción / ad para el comando "dir" enumera carpetas, / b opción para desnudo. Suponiendo que tiene controles para la existencia del archivo en su lugar, use:
dir /ad /b ChangeThisToYourFilename 1> NUL 2> NUL
if %ERRORLEVEL% EQU 0 (
echo is a file
) else (
echo is NOT a file
)
Para un trazador de líneas 1:
dir /a:d /b C:/Windows 2>&1 | findstr /i /n /c:"File Not Found">nul && (@echo. Im a file) || (@echo. Im a folder)
por ejemplo, cambiar C:/Windows
a C:/Windows/Notepad.exe
¡Lo siento, Arun, dbenham, no leí el tuyo! Igual que..
Anteriormente, utilicé el método "/nul"
, pero durante mucho tiempo, he usado "/*"
para probar si una especificación de archivos existente es una carpeta o un archivo. Hasta donde yo sé, funciona en todas las versiones de Windows, desde Windows 95 (y quizás versiones anteriores) a través de todas las versiones actuales de Windows.
Entonces, como con otros métodos, primero prueba si el archivo existe. Luego, para ver si es una "Carpeta", if exist "%fspec%/*"
con: if exist "%fspec%/*"
:
if not exist "%fspec%" goto :NotExistOrInvalid
rem "%fspec%" is "Valid" and is either a "Folder", or a "File".
if exist "%fspec%/*" goto :IsValidAndIsAFolder
rem "%fspec%" is a "File" (a "Regular File" or a Shortcut/Link).
goto :IsValidAndIsAFile
Por ejemplo:
set "fspec=XYZ:%perlpath%"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem Invalid, goto :NotExistOrInvalid
set "fspec=%perlpath%"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem goto :NotExistOrInvalid
rem "%fspec%" Is a "Valid" filespec and is either a "Folder", or a "File".
if exist "%fspec%/*" (echo "%fspec%" is a "Folder".) else echo "%fspec%" is a "File".
set "fspec=%perlpath%/perl.exe"
if not exist "%fspec%" echo "%fspec%": Invalid or not found && rem Invalid, goto :NotExistOrInvalid
rem "%fspec%" Is a "Valid" filespec and is either a "Folder", or a "File".
if exist "%fspec%/*" (echo "%fspec%" is a "Folder".) else echo "%fspec%" is a "File".
El resultado para esto es:
"XYZ:F:/usr/perl/bin": Invalid or not found
"F:/usr/perl/bin" is a "Folder".
"F:/usr/perl/bin/perl.exe" is a "File".
Sé if exist path/nul
prueba if exist path/nul
para una carpeta que solía funcionar en MS-DOS. No sé si se rompió con la introducción de nombres de archivo largos.
Sabía que if exist "long path/nul"
no funciona en Windows batch. Hasta hoy no me había dado cuenta de que if exist path/nul
funciona en Vista y más allá, siempre que el camino esté en la forma corta 8.3.
El código original parece funcionar en Vista. Parece que también debería funcionar en XP, pero creo que la siguiente falla de XP está en el camino: El parámetro de lote% ~ s1 da un nombre corto 8.3 incorrecto .
El código original no necesita el bucle FOR, simplemente podría usar %~s1
Aquí hay una variación que clasifica completamente una ruta como INVALID, FILE o FOLDER. Funciona en Vista, pero NO funciona en XP debido al error %~s1
. No estoy seguro de cómo funciona en MS-DOS.
EDITAR 2015-12-08: Hay una serie de situaciones de Windows donde esto falla
@echo off
if not exist "%~1" ( set "type=INVALID" ) else if exist %~s1/nul ( set "type=FOLDER" ) else ( set "type=FILE" )
@echo "%~1" = %type%
Creo que esta variación funcionará con casi todas las versiones de lotes de Microsoft, incluidos MS-DOS y XP. (Obviamente no funcionará en las primeras versiones de DOS que no son compatibles con PUSHD)
@echo off
if exist "%~1" (2>nul pushd "%~1" && (popd&set "type=FOLDER") || set "type=FILE" ) else set "type=INVALID"
echo "%~1" = %type%
ACTUALIZACIÓN 2014-12-26
Estoy bastante seguro de que lo siguiente funcionará en todas las versiones de Windows desde XP en adelante, pero solo he probado en Win 7.
Editar 2015-12-08: Esto puede fallar en las unidades de red porque la prueba de la carpeta puede informar falsamente un archivo como una carpeta
@echo off
if exist %1/ (
echo %1 is a folder
) else if exist %1 (
echo %1 is a file
) else (
echo %1 does not exist
)
ACTUALIZACIÓN 2015-12-08
Finalmente, una prueba que realmente debería funcionar en cualquier versión de Windows desde XP en adelante, incluso con unidades de red y rutas UNC
for /f "tokens=1,2 delims=d" %%A in ("-%~a1") do if "%%B" neq "" (
echo %1 is a folder
) else if "%%A" neq "-" (
echo %1 is a file
) else (
echo %1 does not exist
)