windows - Bedste måde at kontrollere, om biblioteket kan skrives i BAT script?

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan kan jeg kontrollere, om en mappe kan skrives af den eksekverende bruger fra et batch script?


Her er hvad jeg har prøvet hidtil:


> cd "\%PROGRAMFILES\%"

> echo. > foo
Access is denied.
> echo \%ERRORLEVEL\%
0


Ok, så hvad med ...


> copy NUL > foo
Access is denied.
> echo \%ERRORLEVEL\%
0


Ikke det heller? Så hvad med ...


> copy foo bar
Access is denied.
        0 file(s) copied.
> echo \%ERRORLEVEL\%
1


Dette virker, men det bryder, hvis filen ikke eksisterer.


Jeg har læst noget om interne kommandoer, der ikke angiver ERRORLEVEL, men copy synes tydeligvis at gøre det i sidste tilfælde.

Bedste reference


Du kan skrive copy \%0 foo for at kopiere selve batchfilen.

Dette vil altid eksistere.


Husk at slette filen bagefter og for at sikre, at du ikke overskriver en eksisterende fil ved det pågældende navn.


Der burde være en bedre måde at gøre dette på, men jeg ved ikke om nogen.


REDIGER : Bedre endnu, prøv mkdir foo.

Hvis batchfilen kører ud af et netværk (eller hvis det er meget stort), kan det være hurtigere.

Andre referencer 1


Endelig kører en kommando mod det for at finde ud af om den nægtes, er den nemme måde at gøre det på. Du kan også bruge CACLS til at finde præcis, hvad tilladelserne er eller ikke. Her er en prøve.


I CMD type CACLS /?


CACLS "filename" vil give dig, hvad de nuværende tilladelser er tilladt på filen.
R=Læs, W=Skriv, C=Skift (samme som skriv?), F=Fuld adgang.


EDIT: Du kan også bruge katalognavn.


Så for at gøre en check, ville du:


FOR /F "USEBACKQ tokens=2 delims=:" \%\%F IN (`CACLS "filename" ^| FIND "\%username\%"`) DO (
 IF "\%\%F"=="W" (SET value=true && GOTO:NEXT)
 IF "\%\%F"=="F" (SET value=true && GOTO:NEXT)
 IF "\%\%F"=="C" (SET value=true && GOTO:NEXT)
 SET value=false
)
ECHO This user does not have permissions to write to file.
GOTO:EOF
:NEXT
ECHO This user is able to write to file.

Andre referencer 2


Jeg fandt ud af at udførelsen af ​​copy i batchfilen gentog en fejl til STDERR, men forlod \%ERRORLEVEL\% uberørt (stadig 0). så løsningen var at kombinere kommandoen med en betinget udførelse af set.


copy /Y NUL "\%FOLDER\%.writable" > NUL 2>&1 && set WRITEOK=1
IF DEFINED WRITEOK ( 
  rem ---- we have write access ----
  ...
 ) else (
  rem ---- we don't ----
  ...
)


Dette testes på XP og 7 og synes at arbejde pålideligt.

Andre referencer 3


set testdir=\%programfiles\%
set myguid={A4E30755-FE04-4ab7-BD7F-E006E37B7BF7}.tmp
set waccess=0
echo.> "\%testdir\%\%myguid\%"&&(set waccess=1&del "\%testdir\%\%myguid\%")
echo write access=\%waccess\%