Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用所有者名称脚本重命名所有文件夹_Batch File_Cmd_Rename_Owner - Fatal编程技术网

Batch file 使用所有者名称脚本重命名所有文件夹

Batch file 使用所有者名称脚本重命名所有文件夹,batch-file,cmd,rename,owner,Batch File,Cmd,Rename,Owner,我正在尝试将文件夹中的文件夹名称更改为文件夹所有者的名称。。 例如,我有一个包含一百个其他文件夹的文件夹,所有文件夹的名称都是“我的文档”,所有文件夹的所有者都不同。 我已经找到了用代码查找名称的方法: 直接/质量 但我不知道如何将其放入变量中并使用该变量更改文件夹名称…获取命令输出的常用方法是使用for @echo off for /f "skip=2 tokens=4,*" %%a in ('dir /q /ad^|find "<DIR>"') do ( for /f "to

我正在尝试将文件夹中的文件夹名称更改为文件夹所有者的名称。。 例如,我有一个包含一百个其他文件夹的文件夹,所有文件夹的名称都是“我的文档”,所有文件夹的所有者都不同。 我已经找到了用代码查找名称的方法: 直接/质量
但我不知道如何将其放入变量中并使用该变量更改文件夹名称…

获取命令输出的常用方法是使用
for

@echo off
for /f "skip=2 tokens=4,*" %%a in ('dir /q /ad^|find "<DIR>"') do (
  for /f "tokens=2 delims=\" %%i in ("%%a") do (
    echo owner=%%i
    echo folder=%%b
    echo ren "%%b" "%%i"
  )
)
@echo关闭
对于/f“skip=2令牌=4,*”%%a in('dir/q/ad^ | find”“)do(
对于/f“tokens=2 delims=\”%%i in(“%%a”)do(
回声所有者=%%i
回显文件夹=%%b
echo ren“%%b”“%%i”
)
)
这是一个批处理脚本——我们将其命名为
rename dir by owner.bat
——基于以下代码:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
对于/F“delims=”%%U in('
dir/Q/A:D“%~1”^ find“^ findstr/V/R/C:\.\.$”
""做"(
设置“项=%%U”
setlocal EnableDelayedExpansion
设置“项目=!项目:*=!”&设置“项目=!项目:*\=!”
对于/F“tokens=1,*delims=“%%O in(“!ITEM!”)do(
端部
ECHO ren“%~dp1%%P”“%%O”
setlocal
)
端部
)
端部
退出/B
要使用此脚本,请提供包含要重命名的目录作为命令行参数——例如,假设该目录名为
父文件夹

rename-dir-by-owner.bat "parent-folder"
大写的
ECHO
命令用于测试目的;一旦确实要重命名任何项目,请将其删除


解释 上述脚本中使用的core
dir/Q/A:D
命令行的输出类似于:

这些行由外部
for/F
循环捕获,每一行都存储在变量
项中。之后,直到部分
的所有内容都被删除,然后直到(第一个)
\
的所有内容都被切断。
ITEM
的剩余内容现在被另一个
for/F
循环解析,该循环提取第一个空格前面的所有内容,因此检索所有者的用户名;在空白后面是目录名。两个字符串部分最终都传递给
ren
命令(一旦
ECHO
消失)


使用这种方法,结果(几乎)不依赖于系统的区域设置和区域设置,因此实现了一个非常通用的解决方案。但是,如果用户名包含空格,则此批处理程序会导致意外结果,但Microsoft不建议这样做--请参阅本文“登录名规则”部分。

您可以使用类似于('dir/a:D/Q')do(echo%%O)
的方法获取所有者,假设它不包含空格--在命令提示符中键入
for/?
,然后仔细阅读帮助文本。。。请注意,
dir
的输出取决于系统的区域设置和区域设置…该设置似乎有效(cmd上没有错误),但文件不会更改…:\在本网站上,通常使用“解除武装”潜在危险代码。当您验证输出是否正常时,删除
ren
前面的
echo
。现在它得到“Sintax不正确”,因为它使用的名称是“domain\user”。。。我可以删除“\”之前的所有内容吗
 Volume in drive D has no label.
 Volume Serial Number is XXXX-XXXX

 Directory of D:\Data

2016/01/01  00:00    <DIR>          NT AUTHORITY\SYSTEM    .
2016/01/01  00:00    <DIR>          BUILTIN\Administrators ..
2015/07/01  01:00    <JUNCTION>     NT AUTHORITY\SYSTEM    AppData [C:\Users\aschipfl\AppData\Roaming]
2016/03/21  20:00    <DIR>          HOST\aschipfl          Documents
2016/05/18  23:00    <DIR>          HOST\aschipfl          Drawings
2016/04/01  13:00    <DIR>          HOST\aschipfl          Projects
               0 File(s)              0 bytes
               6 Dir(s)   2'147'483'648 bytes free
2016/03/21  20:00    <DIR>          HOST\aschipfl          Documents
2016/05/18  23:00    <DIR>          HOST\aschipfl          Drawings
2016/04/01  13:00    <DIR>          HOST\aschipfl          Projects