在 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
显然在最后一种情况下似乎这样做了。
How can I check whether a directory is writable by the executing user from a batch script?
Here's what I've tried so far:
> cd "%PROGRAMFILES%"
> echo. > foo
Access is denied.
> echo %ERRORLEVEL%
0
Ok, so how about...
> copy NUL > foo
Access is denied.
> echo %ERRORLEVEL%
0
Not that either? Then what about...
> copy foo bar
Access is denied.
0 file(s) copied.
> echo %ERRORLEVEL%
1
This works, but it breaks if the file doesn't exist.
I've read something about internal commands not setting ERRORLEVEL, but copy
obviously seems to do so in the last case.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
当然,对它运行命令来查找它是否被拒绝是最简单的方法。您还可以使用 CACLS 来准确查找权限是什么或不是。这是一个示例。
在 CMD 中输入
CACLS /?
CACLS "filename"
将为您提供文件当前允许的权限。R = 读取,W = 写入,C = 更改(与写入相同?),F = 完全访问。
编辑:您也可以使用目录名称。
因此,要进行检查,您需要:
Definitely running a command against it to find if its denied is the easy way to do it. You can also use CACLS to find exactly what the permissions are or aren't. Here's a sample.
In CMD type
CACLS /?
CACLS "filename"
will give you what the current permissions is allowed on the file.R = Read, W = Write, C = Change (same as write?), F = Full access.
EDIT: You can use directory name as well.
So to do a check, you would:
您可以编写
copy %0 foo
来复制批处理文件本身。这将永远存在。
请记住随后删除该文件,并确保不会用该名称覆盖现有文件。
应该有更好的方法来做到这一点,但我不知道。
编辑:更好的是,尝试
mkdir foo
。如果批处理文件在网络上运行(或者它非常大),这可能会更快。
You can write
copy %0 foo
to copy the batch file itself.This will always exist.
Remember to delete the file afterwards, and to make sure that you aren't overwriting an existing file by that name.
There ought to be a better way to do this, but I don't know of any.
EDIT: Better yet, try
mkdir foo
.In case the batch file is running off a network (or if it's very large), this may be faster.
我发现在批处理文件中执行
copy
会向STDERR回显错误,但%ERRORLEVEL%
保持不变(仍然为0)。因此解决方法是将命令与set
的条件执行结合起来。这已经在 XP 和 7 上进行了测试,似乎工作可靠。
i found that executing
copy
within the batch file echoed an error to STDERR, but left%ERRORLEVEL%
untouched (still 0). so the workaround was to combine the command with a conditional execution ofset
.this is tested on XP and 7 and seems to work reliably.
Mechaflash 答案的扩展,并通过为“测试”生成唯一的文件名来解决覆盖文件的问题文件。
(
%~1
为输入目录)编辑:如果你想要一个更安全的选择
An extension to Mechaflash's answer, and solves the problem of overwriting the file by generating a unique filename for the "testing" file.
(
%~1
is the input directory)EDIT: If you want a more safe option
您可以使用
echo
解决这个问题。尝试使用
echo
写入文件。成功后 (&&
) 再次删除%tmpfile%
并执行某些操作。出错时 (||
) 执行不同的操作。示例
check-directory.bat
You can solve this problem by using
echo
.Try writing to a file with
echo
. On succes (&&
) delete the%tmpfile%
again and do something. On error (||
) do something different.Example
check-directory.bat
2023 UPDATE
安东尼·米勒的答案已贬值,这是更新版本。
这会检查用户是否具有
C:
驱动器的完全访问权限。它首先读取特定驱动器上用户的
ICALS
输出,例如(OI)(CI)(F)
。然后,它将其分配给perm_str
并创建一个新变量adj_perm_str
,其中字母F
(完全控制)被删除。如果perm_str
和adj_perm_str
相等,则不存在F
。如果有,则用户拥有完全控制权。如果要检查不同磁盘的权限,请更改
CHK_DISK
,请调整CHK_PERMISSION
以检查其他权限。2023 UPDATE
Anthony Miller's answer is depreciated, this is the updated version.
This checks if the user has full access on the
C:
drive.It first reads the
ICALS
output for the user on the specific drive, for example(OI)(CI)(F)
. It then assigns this toperm_str
and creates a new variableadj_perm_str
where the letterF
(full control) is removed. If theperm_str
andadj_perm_str
are equal, there is noF
present. If there is, the user has full control.Change
CHK_DISK
if you want to check permission for a different disk, adjustCHK_PERMISSION
to check for other permissions.