2011-12-29 12 views
9

मैं यहाँ की खोज, इसविंडोज बैच फ़ाइल में कोई पथ फ़ाइल या निर्देशिका है या नहीं, तो परीक्षण कैसे करें?

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

का उपयोग कर किसी पाया, लेकिन काम नहीं किया, जब %1==c:\this is a file with spaces.csproj, परीक्षण अभी भी सफलता है, जो यह अभी भी एक फ़ोल्डर के रूप में माना जाएगा मतलब है !!!

किसी को भी इस सवाल का जवाब जानता है, मैं लगता है कि यह एक बहुत ही आम समस्या है और Windows कई कई वर्षों के लिए ही अस्तित्व में है, यह एक बहुत ही सरल समाधान होना चाहिए ....

+1

वास्तव में आपका प्रश्न है एमएस-डॉस के बारे में, या विंडोज़ में कमांड प्रॉम्प्ट के बारे में? और कौन सा संस्करण? – wimh

+0

मेरा परीक्षण वातावरण विंडोज 7 x64 और विंडोज एक्सपी दोनों हैं, मैंने अन्य प्लेटफार्मों पर कोशिश नहीं की। धन्यवाद। – aaron

उत्तर

20

मैं MS-DOS पर काम करता था एक फ़ोल्डर के लिए if exist path\nul परीक्षण पता है। मुझे नहीं पता कि यह लंबे फ़ाइल नामों के परिचय के साथ टूट गया था या नहीं।

मुझे पता था कि if exist "long path\nul" विंडोज बैच पर काम नहीं करता है। मुझे आज तक एहसास नहीं हुआ कि if exist path\nul विस्टा पर काम करता है और जब तक पथ कम 8.3 रूप में होता है।

मूल कोड Vista पर काम करने के लिए प्रतीत होता है। ऐसा लगता है कि इसे XP पर भी काम करना चाहिए, लेकिन मेरा मानना ​​है कि निम्न XP बग रास्ते में हो रहा है: Batch parameter %~s1 gives incorrect 8.3 short name

मूल कोड पाश के लिए की जरूरत नहीं है, यह बस %~s1

इस्तेमाल कर सकते हैं यहाँ एक भिन्नता है कि पूरी तरह से अवैध, फ़ाइल या फ़ोल्डर के रूप में एक पथ में वर्गीकृत किया है। यह Vista पर काम करता है, लेकिन %~s1 बग के कारण XP पर काम नहीं करता है। मुझे यकीन नहीं है कि यह एमएस-डॉस पर कैसे प्रदर्शन करता है।
संपादित करें 2015/12/08: विंडोज स्थितियों की एक संख्या है, जहां यह विफल रहता है

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

मेरा मानना ​​है कि इस बदलाव MS-DOS और XP सहित माइक्रोसॉफ्ट बैच के लगभग सभी संस्करणों के साथ काम करेंगे रहे हैं ।

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

अद्यतन (यह स्पष्ट रूप से है कि PUSHD का समर्थन नहीं करते डॉस के प्रारंभिक संस्करणों पर काम नहीं करेगा) 2014-12-26

मैं यकीन है कि निम्नलिखित सभी संस्करणों पर काम करेंगे हूँ विंडोज़ के एक्सपी से आगे, लेकिन मैंने केवल विन 7 पर परीक्षण किया है।
संपादित करें 2015/12/08: इस नेटवर्क ड्राइव पर असफल हो सकता है क्योंकि फ़ोल्डर परीक्षण झूठा एक फ़ोल्डर

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

अद्यतन 2015-12-08

के रूप में एक फ़ाइल रिपोर्ट कर सकते हैं अंत में - एक परीक्षण जो वास्तव में XP ड्राइव से किसी भी विंडोज संस्करण पर काम करना चाहिए, जिसमें नेटवर्क ड्राइव और यूएनसी पथ

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 
) 
+0

मैं इसका उपयोग करूंगा, धन्यवाद! – aaron

+0

@ डेबेनहम: 2014 अपडेट पर संक्षिप्त नोट, क्या उद्धरण में '% 1 \' और '% 1' भागों को रखना अच्छा नहीं होगा? – zb226

+1

@ zb226 - नहीं, अतिरिक्त उद्धरण जोड़ने की आवश्यकता नहीं है। तर्क पहले ही उद्धृत किया जाना चाहिए, अन्यथा आप इसे पहले स्थान पर प्राप्त नहीं कर पाएंगे। ध्यान दें कि किसी भी उद्धरण के बाहर '\' होने के लिए यह चोट नहीं पहुंचाता है। '" सी: \ पथ \ "' और '" सी: \ पथ "\' बराबर हैं। यदि आप वास्तव में अपने उद्धरणों को स्पष्ट रूप से जोड़ना चाहते हैं, तो आपको '"% ~ 1 "' और '"% ~ 1 \ "' का उपयोग करना होगा। – dbenham

6

मैं सिर्फ इस तरह से कोशिश की। उम्मीद है की यह मदद करेगा।

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

आउटपुट:

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 
+0

ग्रेट, धन्यवाद! और मैंने इसे एक कूड़ा छोटा बना दिया: 'PUSHD% 1 2> NUL && SET IS_DIR = 1 || SET IS_DIR = 0 और POPD' – aaron

1

"dir" कमांड के लिए/विज्ञापन विकल्प फ़ोल्डर्स सूचीबद्ध करता है,/बी नंगे के लिए विकल्प। मान लें कि आप जगह में फ़ाइल के अस्तित्व के लिए जाँच करता है है, का उपयोग करें:

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

काम करता है यदि आप 'फ़ोल्डर है' या 'फ़ोल्डर नहीं है' पढ़ने के लिए टेक्स्ट बदलते हैं। इसे करने का दिलचस्प तरीका। सहज नहीं है, लेकिन काम करता है क्योंकि फ़ोल्डर में हमेशा होता है। और .. निर्देशिका के भीतर उपलब्ध है। एक फ़ाइल कभी नहीं करता है। – dbenham

+0

सरल वाक्यविन्यास - एक ही समाधान: 'dir/ad/b" somePath "1> nul 2> nul && (गूंज एक फ़ोल्डर है) || (गूंज एक फ़ोल्डर नहीं है) ' – dbenham

+0

यदि फ़ोल्डर में बहुत सारे उप-फ़ोल्डर्स हैं, तो इसे निष्पादित करने में कुछ समय लग सकता है? – aaron

1

एक 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) 

उदा C:\Windows से C:\Windows\Notepad.exe

-सोरी अरुण, डबेनहम, ने आपका नहीं पढ़ा! जैसा कि ..

+0

हम्म, इसमें स्थानीयकरण समस्या हो सकती है? – aaron

+0

बिना खोज के इसके छोटे: 'डीआईआर/ए: डी/बी सी: \ विंडोज 2> nul> nul && (@echo। Im एक फ़ाइल) || (@echo। मैं एक फ़ोल्डर) ' – Radon8472

0

पहले, मैंने "\nul" विधि का उपयोग किया था, लेकिन लंबे समय से, मैंने परीक्षण किया है कि मौजूदा फाइलपेक एक फ़ोल्डर या फ़ाइल है या नहीं, तो मैंने "\*" का उपयोग किया है। जहां तक ​​मुझे पता है, यह सभी मौजूदा विंडोज संस्करणों के माध्यम से विंडोज 95 (और शायद पुराने संस्करणों) से विंडोज के सभी संस्करणों पर काम करता है।

तो, अन्य तरीकों के साथ, फ़ाइल मौजूद होने पर पहले परीक्षण करें। फिर, अगर यह एक "फ़ोल्डर" है देखने के लिए, के साथ यह परीक्षण: 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 

उदाहरण के लिए:

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

इस के लिए उत्पादन होता है:

"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". 
संबंधित मुद्दे