在.bat
Windows cmd.exe 的文件中,递归获取文件夹内容的所有权
takeown /f foldername /r /d Y >nul: 2>&1
问题是,它只在当前语言环境中是的以字母开头Y
。例如,它在法语中失败,因为法语使用是的,因此需要O
。
有什么解决方法吗?
答案1
您可以使用该COPY
命令来确定机器使用的“是”响应。
@echo off
setlocal
for /f "delims=(/ tokens=2" %%Y in (
'"copy /-y nul "%~f0" <nul"'
) do if not defined yes set "yes=%%Y"
takeown /f foldername /r /d %yes% >nul 2>&1
该%yes%
值将是整个单词,而不仅仅是第一个字母。我认为这样就很好了。但如果我错了,你可以直接使用%yes:~0,1%
。
更新
正如 fgrieu 在其评论中指出的那样,如果脚本路径包含 ,则上述操作将失败(
。可以通过放弃外部双引号并转义重定向来修复由于其他特殊字符导致的失败。但 是(
有问题的。
这是另一种策略,只要%temp%
指向用户具有写权限的有效文件夹,它就可以工作。它会创建一个已知不会造成问题的文件。如果该文件已经存在,%temp%
则不会受到影响。
@echo off
setlocal
pushd "%temp%"
if not exist getYes.tmp (call ) >>getYes.tmp
set "yes="
for /f "delims=(/ tokens=2" %%Y in (
'"copy /-y nul getYes.dummy <nul"'
) do if not defined yes set "yes=%%Y"
takeown /f foldername /r /d %yes% >nul 2>&1
我认为不能保证 COPY 和 TAKEOWN 会使用相同的“是”响应,但如果它们不这样做,我会感到震惊。