递归地赋予文件可写权限

4
我正在尝试使用以下命令使特定文件夹内的所有文件都可写:

for /d /r . %%d in (nbproject) do @if exist "%%d" dir "%%d" /S | attrib -R /S /D "%%d"

在特定文件夹内执行以下命令可以正常工作:

dir "%%d" /S | attrib -R

但是当从批处理脚本中运行时,它无法正确执行。请给出建议。
1个回答

6

像这样使用嵌套循环:只需将文件夹名称更改为您选择的文件夹即可。

@echo off
for /D /R %%D in (nbproject Folder2 Folder3) do if exist "%%~fD" (
    pushd "%%~fD"
    for /R %%F in (*) do if exist "%%~fF" attrib -R "%%~fF" /D
    popd
)

一句话概括:

for /D /R %%D in (nbproject Folder2 Folder3) do @if exist "%%~fD" @cd /D "%%~fD" && for /R %%F in (*) do @if exist "%%~fF" attrib -R "%%~fF" /D

让我们来分析一下你的第一行代码,找出它可能失败的原因。

  1. 你正在将dir命令的输出导入到attrib命令中,并使用了d变量。只需要一个变量即可。如果与attrib一起使用d变量,请使用&符号;否则请删除d变量。
  2. 使用dir命令的/b选项,尤其是在将其输出导入其他命令时。
  3. 在for命令中不需要使用.表示当前目录,如果没有指定,则默认为当前目录。
  4. 引用循环变量时,请使用波浪线~去掉现有的引号,以避免出现双引号。
  5. 在使用dir命令中的attrib选项时,不需要使用/S选项。

示例:

for /d /r %%d in (nbproject) do @if exist "%%~d" dir "%%~d" /B /S | attrib -R /D

谢谢您的解释,但这会使得nbproject同级别的所有文件夹中的所有文件都可写。尝试了一些变化,但无法完成。 - Basit Anwer
@BasitAnwer 我修复了我的代码,只搜索相关目录。然而,我修复的你的代码对我来说完全正常。你只需要将每个文件夹名称添加到第一个for循环括号内的空格分隔列表中即可。 - David Ruhmann
很抱歉,你修复的代码没有起作用...经过一些尝试,我最终成功让它工作了==== 对于/d/r。在(nbproject)中,做@如果存在“%%〜d” dir“%%d”/S | attrib -R“%%〜d”*.* /S /D - Basit Anwer
你更新后的代码完美运行了,我想我的for循环太简陋了,所以使用了你的 :) - Basit Anwer
尝试使用一行代码时出现以下错误:%%D 在此处是意外的。 - domino_katrino
1
@domino_katrino,这个一行代码仍然使用批处理变量语法。 如果你想在命令行上使用这个一行代码,你必须把 %% 改成 %。 以这个例子为例:for /d /r %D in (nbproject) do @if exist "%~D" dir "%~D" /B /S | attrib -R /D - David Ruhmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接