2011-09-01 22 views
6

如何從批處理腳本中檢查執行用戶是否可以寫入目錄?檢查BAT腳本中的目錄是否可寫的最佳方法?

這裏是我試過到目前爲止:

> cd "%PROGRAMFILES%" 

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

好了,怎麼樣?

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

不要麼?那麼怎麼樣...

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

這可以工作,但它會中斷如果文件不存在。

我讀過一些關於內部命令但沒有設置ERRORLEVEL的內容,但copy顯然在最後一種情況下是這樣做的。

+1

哦,是啊...窗戶環境會讓你失望的。許多命令不會正確返回%errorlevel%...以及許多使用命令行參數的已安裝應用程序。 = D – Mechaflash

+1

哈哈,是的......更不用說那些含有空格的引用和路徑的薄諺語冰。我使用了8.3路徑名。 ;) – batshcrazy

+1

你可能會得到更多的運氣與這個問題在SO姐姐網站..超級用戶。com – inspite

回答

3

您可以編寫copy %0 foo來複制批處理文件本身。
這將永遠存在。

請記住隨後刪除該文件,並確保您沒有用該名稱覆蓋現有文件。

應該有更好的方法來做到這一點,但我不知道任何。

編輯:更好的是,試試mkdir foo
如果批處理文件在網絡中運行(或者它非常大),這可能會更快。

+0

聰明:)。我還沒有回答我自己的問題,但它讓我感到震驚,我也可以'複製NUL foo'並獲得相同的結果。 – batshcrazy

+0

例如,您也可以用'copy nul foo'創建一個空文件。 – Joey

+0

它不會在使用「call:label」觸發的腳本中工作,因爲%0是標籤名稱 - 所以不是「always」。 ;) –

3

絕對運行一個命令反對它,以發現它是否被拒絕是簡單的方法來做到這一點。您也可以使用CACLS來準確查找權限是或不是。這是一個示例。

在CMD型CACLS /?

CACLS "filename"會給你什麼樣的當前權限允許對文件。 R =讀取,W =寫入,C =更改(與寫入相同),F =完全訪問。

編輯:您也可以使用目錄名稱。

所以做檢查,你會:

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

+1爲正確。 – SLaks

+1

這是不正確的,你可以訪問一個文件夾,而無需爲你的用戶(管理員,用戶,所有人等)使用特定的ACE – Anders

+0

@Anders創建一個文件夾並在文件夾'cacls foldername/P%computername %\%用戶名%:R'現在將CD放入它並執行'ECHO hello> file.txt'你會得到一個拒絕訪問。 – Mechaflash

0
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% 
1

我發現,在批處理文件中執行copy呼應的錯誤STDERR,但留下%ERRORLEVEL%不變(仍爲0)。所以解決方法是將該命令與條件執行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 ---- 
    ... 
) 

這是在XP和7測試,似乎工作可靠。

相關問題