如何从批处理脚本检查目录是否可由执行用户写入?
以下是我目前所做的尝试:
> 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
显然在最后一种情况下这样做了。
6条答案
按热度按时间fae0ux8s1#
最简单的方法就是对它运行一个命令来确定它是否被拒绝。你也可以使用CACLS来确定权限是什么或不是什么。下面是一个例子。
在CMD类型
CACLS /?
中CACLS "filename"
会给予你当前文件允许的权限。R =读,W =写,C =更改(和写一样?),F =完全访问。编辑:您也可以使用目录名称。
所以要做一个检查,你会:
mzillmmw2#
您可以编写
copy %0 foo
来复制批处理文件本身。这将永远存在。
请记住在之后删除该文件,并确保您没有用该名称覆盖现有文件。
应该有更好的方法来做这件事,但我不知道任何。
EDIT:最好试试
mkdir foo
。如果批处理文件是在网络上运行的(或者如果它非常大),这可能会更快。
5anewei63#
hgc7kmma4#
我发现在批处理文件中执行
copy
会向STDERR返回一个错误,但%ERRORLEVEL%
没有被修改(仍然是0)。因此解决方法是将该命令与set
的条件执行结合起来。这是在XP和7上测试的,似乎工作可靠。
yhuiod9q5#
Mechaflash的答案的扩展,并通过为“测试”文件生成唯一的文件名来解决覆盖文件的问题。
(
%~1
是输入目录)编辑:如果你想要一个更安全的选择
j91ykkif6#
您可以使用
echo
解决此问题。尝试用
echo
写入文件。如果成功(&&
),请再次删除%tmpfile%
并执行一些操作。如果出错(||
),请执行其他操作。示例
check-directory.bat