Comment tester si un chemin est un fichier ou un répertoire dans un fichier de commandes Windows?

J’ai cherché ici, trouvé quelqu’un en utilisant cette

set is_dir=0 for %%i in ("%~1") do if exist "%%~si"\nul set is_dir=1 

mais n’a pas fonctionné, quand %1==c:\this is a file with spaces.csproj , le test a toujours du succès, ce qui signifie qu’il sera toujours traité comme un dossier !!!

n’importe qui connaît la réponse, je suppose que c’est un problème très courant et Windows existe depuis de nombreuses années, il devrait avoir une solution très simple ….

Je sais que le if exist path\nul test pour un dossier utilisé pour travailler sur MS-DOS. Je ne sais pas si cela a été cassé avec l’introduction de noms de fichiers longs.

Je savais que if exist "long path\nul" ne fonctionne pas sur Windows batch. Je n’ai pas réalisé jusqu’à aujourd’hui que if exist path\nul fonctionne sur Vista et au-delà tant que le chemin est sous la forme 8.3 courte.

Le code d’origine semble fonctionner sur Vista. Il semble que cela devrait également fonctionner sur XP, mais je pense que le bogue XP suivant est en train de se poser : Le paramètre de lot% ~ s1 donne un nom abrégé 8.3 incorrect .

Le code d’origine n’a pas besoin de la boucle FOR, il pourrait simplement utiliser %~s1

Voici une variante qui classe complètement un chemin comme INVALID, FILE ou FOLDER. Cela fonctionne sur Vista, mais ne fonctionne PAS sur XP à cause du bogue %~s1 . Je ne sais pas comment il fonctionne sur MS-DOS.
EDIT 2015-12-08: Il existe un certain nombre de situations Windows où cela échoue

 @echo off if not exist "%~1" ( set "type=INVALID" ) else if exist %~s1\nul ( set "type=FOLDER" ) else ( set "type=FILE" ) @echo "%~1" = %type% 

Je crois que cette variation fonctionnera avec presque toutes les versions de Microsoft batch, y compris MS-DOS et XP. (de toute évidence, cela ne fonctionnera pas sur les premières versions de DOS qui ne supportent pas PUSHD)

 @echo off if exist "%~1" (2>nul pushd "%~1" && (popd&set "type=FOLDER") || set "type=FILE" ) else set "type=INVALID" echo "%~1" = %type% 

MISE À JOUR 2014-12-26

Je suis presque sûr que ce qui suit fonctionnera sur toutes les versions de Windows à partir de XP, mais je n’ai testé que sur Windows 7.
Modifier le 12/12/2015: Cela peut échouer sur les lecteurs réseau car le test du dossier peut signaler un fichier comme un dossier.

 @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 ) 

MISE À JOUR 2015-12-08

Enfin, un test qui devrait fonctionner sur toutes les versions de Windows à partir de XP, y compris les lecteurs réseau et les chemins 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 ) 

Je viens d’essayer de cette façon. J’espère que cela t’aides.

 @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% 

Sortie:

 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 

L’option / ad pour la commande “dir” répertorie les dossiers, / b option pour bare. En supposant que vous avez des contrôles pour l’existence du fichier en place, utilisez:

 dir /ad /b ChangeThisToYourFilename 1> NUL 2> NUL if %ERRORLEVEL% EQU 0 ( echo is a file ) else ( echo is NOT a file ) 

Pour un liner:

 dir /a:d /b C:\Windows 2>&1 | findstr /i /n /c:"File Not Found">nul && (@echo. Im a file) || (@echo. Im a folder) 

par exemple, changez C:\Windows en C:\Windows\Notepad.exe

-Désolé Arun, dbenham, n’a pas lu le tien! Pareil que..

Auparavant, j’utilisais la méthode "\nul" , mais depuis longtemps, j’ai utilisé "\*" pour tester si un fichier existant est un dossier ou un fichier. Pour autant que je sache, cela fonctionne sur toutes les versions de Windows, à partir de Windows 95 (et peut-être des versions antérieures) à travers toutes les versions actuelles de Windows.

Donc, comme pour les autres méthodes, testez d’abord si le fichier existe. Ensuite, pour voir si c’est un “Dossier”, testez-le avec: 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 

Par exemple:

 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". 

La sortie pour ceci est:

 "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".