So überprüfen Sie, ob eine Datei/ein Dire in Stapelskripten beschreibbar ist
-
22-09-2019 - |
Frage
In Bash würde ich verwenden
[ -w ... ]
Was ist das Äquivalent für Windows -Batch -Dateien?
Lösung
Soweit ich weiß, können Sie herausfinden, ob die Datei existiert oder nicht, Aber es gibt keine Möglichkeit zu wissen, ob es schriftlich ist, abgesehen davon, dass es versucht, darüber zu schreiben. Es geht nicht nur darum, das nicht zu haben R Flagge; Network- und NTFS -Berechtigungen sind ebenfalls beteiligt (und wahrscheinlich auch Gruppenrichtlinien).
Wenn Sie Ihren Code neu schreiben können, können Sie den Rückgabecode des Schreibvorgangs durch die Writing -Operation erfassen Fehlerlevel.
Andere Tipps
Sorry Leute, die hier eingeschüttet haben.
Dies ist vielleicht nicht zu 100% das, wonach Sie suchen, aber ich habe dies mit In-Use-Protokolldateien für Apache Tomcat verwendet und es funktioniert absolut perfekt.
Vielen Dank an @dbenham für seinen großartigen Code! https://stackoverflow.com/a/10520609/175063
SETLOCAL ENABLEDELAYEDEXPANSION
REM TOMCAT LOGS
FOR /r "D:\logs" %%X IN (*) DO (
SET FileName=%%~nxX
2>nul ( >>D:\logs\!FileName!" (call )) && (
REM DO STUFF HERE
SET ModDt=%%~tX
FOR /f "tokens=1-3 delims=.:/ " %%j IN ("!ModDt!") DO SET FDate=%%l-%%j-%%k&Set RegDate=%%j-%%k-%%l
IF "%CurrentDate%" NEQ "!FDate!" (
IF %%~zX GTR 0 (
ECHO ARCHIVING "D:\logs\!FileName!" >> %logfile%
7za.exe -tzip -y a "D:\Zips\%COMPUTERNAME%-Tomcat-!RegDate!-compressed.zip" "D:\logs\!FileName!" && (
DEL /Q "D:\logs\!FileName!"
) || (
if "%ERRORLEVEL%" == "2" (
echo Zipping failed ^(exit status %ERRORLEVEL%^). Trying again in 5 seconds...
) else (
echo Zip completed with warnings ^(most likely because a file was locked by another
echo process and had to be skipped^). Trying again in 5 seconds...
)
del "D:\Zips\%COMPUTERNAME%-Tomcat-!RegDate!-compressed.zip" >NUL 2>&1
PING 0.0.0.0 -n 6 -w 1000 >NUL
)
)
)
REM END OF UNLOCKED ZONE
) || (
ECHO FILE IS LOCKED
)
)
Sie können es mit VBScript so machen
Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
Set objFile = objFS.GetFile(strFile)
If Not objFile.Attributes And 1 Then
WScript.Echo "The file is Read/Write."
Else
WScript.Echo "The file is Read-only."
End If
Speichern Sie als check.vbs und auf Befehlszeile
c:\test> cscript //nologo check.vbs myfile
ls -l foo.txt
Ausgänge -r- r-R-- Ausgänge für eine nicht beschreibbare Dateiausgänge -rw-r-R-- für eine beschreibbare Datei
Sie können den Wert speichern und prüfen, ob der 3. Charakter "W" für beschreibbar ist oder "-" für nicht beschreibbar ist.
Verwenden einer Syntax wie %myVar:~2,1%
in einer bedingten Aussage.
Ich bin mir nicht sicher, wie os abhängig sein würde.