2009-05-20 5 views
9

Ich schreibe eine Batch-Datei und ich muss wissen, ob eine Datei schreibgeschützt ist. Wie kann ich das machen ?Testen für Dateiattribut in Batch-Datei

Ich weiß, wie man sie mit dem Modifizierer% ~ a bekommen, aber ich weiß nicht, was ich mit dieser Ausgabe machen soll. Es gibt so etwas wie -ra ------. Wie kann ich dies in Batch-Datei analysieren?

+0

Welche Art von Batch-Datei? Bash, DOS ...? –

+0

Windows-Batch-Dateien, wie Sie von ihm mit% ~ a erwähnen können. – Joey

Antwort

12

So etwas sollte funktionieren:

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

Als ich das laufen bekomme ich folgende Ausgabe:

 
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

Ich wusste nichts über das ~ 1: 1 Danke! –

+0

Ok, das funktioniert für 1 Datei, aber wenn INPUT ein Set ist, haben ATTRIBS immer den gleichen Wert. Ich habe versucht SetLocal EnableDelayedExpansion, aber es beschwert sich, wenn ich versuche zu verwenden! ATTRIBS: ~ 1,1! Was könnte ich tuen ? –

+0

Danke! Aus irgendeinem Grund mit! ATTRIBS: ~ 1,1! direkt im Vergleich hat nicht funktioniert, aber speichert es in einer anderen Variable funktioniert. –

5

eine bestimmte Datei zu testen:

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

Um eine zu bekommen Liste der Nur-Lese-Dateien

Um eine Liste von Lese zu erhalten/Schreiben von Dateien

dir /a-r * 

Um alle Dateien auflisten und berichten, ob nur lesen oder lesen/schreiben:

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

EDIT

Patrick's answer schlägt fehl, wenn der Dateiname ! enthält. Dies kann durch Hin- und Herschalten verzögerte Expansion und Ausschalten innerhalb der Schleife gelöst werden, aber es gibt einen anderen Weg, um den Wert %%~aF zu sondieren, ohne zu einer verzögerten Expansion zurückgreifen, oder auch eine Umgebungsvariable:

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 
) 
) 
Verwandte Themen