2011-09-01 32 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

オハイオ州オハイオ州...ええ、Windows環境はそれであなたを怒らせます。多くのコマンドは、%errorlevel%を正しく返しません。また、コマンドライン引数を使用する多くのインストール済みアプリケーションも返します。 = D – Mechaflash

+1

haha​​、yeah ...引用符とスペースを含むパスである薄い諺の氷はもちろんですが。私は8.3のパス名を使用していました。 ;) – batshcrazy

+1

あなたはこの姉妹サイトのスーパーユーザーでこの質問にもっと幸運を祈るかもしれません。com – inspite

答えて

3

copy %0 fooと書くと、バッチファイル自体をコピーできます。
これは常に存在します。

このファイルを後で削除し、その名前で既存のファイルを上書きしないように注意してください。

これを行うには、より良い方法があるはずですが、私にはわかりません。

EDIT:まだ、試してみてください。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 =フルアクセス。

EDIT:ディレクトリ名も使用できます。だから、チェックを行うには

、あなたがなります

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

@アンダーフォルダを作成し、 'cacls foldername/P%computername %\%username%: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にエラーをエコーが、(まだ0)手つかず%ERRORLEVEL%を残しました。回避策は、コマンドを条件付き実行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でテストされており、確実に動作するようです。

関連する問題