2009-05-20 7 views
9

मैं बैच फ़ाइल लिख रहा हूं और मुझे यह जानने की जरूरत है कि फ़ाइल केवल पढ़ने के लिए है या नहीं। मैं उसे कैसे कर सकता हूँ ?बैच फ़ाइल में फ़ाइल विशेषता के लिए परीक्षण

मुझे पता है कि% ~ एक संशोधक का उपयोग करके उन्हें कैसे प्राप्त किया जाए लेकिन मुझे नहीं पता कि इस आउटपुट के साथ क्या करना है। यह कुछ ----- - जैसे कुछ देता है। बैच फ़ाइल में मैं इसे कैसे पार्स कर सकता हूं?

+0

बैच फ़ाइल किस तरह का? बाश, डॉस ...? –

+0

विंडोज बैच फ़ाइलें, जैसा कि आप उनमें से% ~ ए का उल्लेख कर सकते हैं। – Joey

उत्तर

12

इस तरह काम करना चाहिए:

@echo OFF 

SETLOCAL enableextensions enabledelayedexpansion 

set INPUT=test* 

for %%F in (%INPUT%) do (
    set ATTRIBS=%%~aF 
    set CURR_FILE=%%~nxF 
    set READ_ATTRIB=!ATTRIBS:~1,1! 

    @echo File: !CURR_FILE! 
    @echo Attributes: !ATTRIBS! 
    @echo Read attribute set to: !READ_ATTRIB! 

    if !READ_ATTRIB!==- (
     @echo !CURR_FILE! is read-write 
    ) else (
     @echo !CURR_FILE! is read only 
    ) 

    @echo. 
) 

जब मैं इस चलाने मैं निम्नलिखित उत्पादन प्राप्त करें:

dir /ar yourFile.ext >nul 2>nul && echo file is read only || echo file is NOT read only 

एक पाने के लिए:

 
File: test.bat 
Attributes: --a------ 
Read attribute set to: - 
test.bat is read-write 

File: test.sql 
Attributes: -ra------ 
Read attribute set to: r 
test.sql is read only 

File: test.vbs 
Attributes: --a------ 
Read attribute set to: - 
test.vbs is read-write 

File: teststring.txt 
Attributes: --a------ 
Read attribute set to: - 
teststring.txt is read-write 
+0

मुझे ~ 1: 1 धन्यवाद के बारे में पता नहीं था! –

+0

ठीक है यह 1 फ़ाइल के लिए काम कर रहा है लेकिन यदि इनपुट एक सेट है, तो ATTRIBS के पास हमेशा एक ही मूल्य होगा। मैंने setLocal EnableDelayedExpansion की कोशिश की लेकिन जब मैं उपयोग करने का प्रयास करता हूं तो यह शिकायत करता है! ATTRIBS: ~ 1,1! मैं क्या कर सकता था ? –

+0

धन्यवाद! कुछ कारणों से उपयोग करने के लिए! ATTRIBS: ~ 1,1! सीधे तुलना में काम नहीं किया था, लेकिन इसे एक और परिवर्तनीय कार्यों में संग्रहित किया। –

5

एक विशिष्ट फ़ाइल का परीक्षण करने के केवल पढ़ने की फाइलों की सूची

dir /ar * 

पढ़ने की एक सूची प्राप्त/फ़ाइलें

dir /a-r * 

बारे में सभी फ़ाइलों की सूची और रिपोर्ट है कि क्या केवल पढ़ने के लिए या पढ़ने के लिए/लिखने के लिए:

for %%F in (*) do dir /ar "%%F" >nul 2>nul && echo Read Only: %%F|| echo Read/Write: %%F 

संपादित

Patrick's answer विफल रहता है यदि फ़ाइल नाम में ! है। इस लूप के भीतर चालू और बंद देरी विस्तार टॉगल करके हल किया जा सकता है, लेकिन वहाँ देरी विस्तार का सहारा के बिना %%~aF मूल्य की जांच करने का एक और तरीका, या यहाँ तक कि एक वातावरण चर रहा है:

for %%F in (*) do for /f "tokens=1,2 delims=a" %%A in ("%%~aF") do (
    if "%%B" equ "" (
    echo "%%F" is NOT read only 
) else (
    echo "%%F" is read only 
) 
)