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

时间:2016-05-18 14:40:40

标签: batch-file cmd rename owner

我试图将文件夹中的文件夹名称更改为文件夹所有者的名称.. 例如,我有一个文件夹,其中包含一百个其他文件夹,所有文件夹的名称都是“我的文档”,所有文件夹都有一个不同的所有者。 我已经找到了一种用代码查找名称的方法: dir / q 但我没有关于如何将它放在变量中并使用该变量来更改文件夹名称的意识......

2 个答案:

答案 0 :(得分:0)

获取命令输出的常用方法是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"
  )
)

答案 1 :(得分:0)

这是一个批处理脚本 - 让我们称之为rename-dir-by-owner.bat - 基于my comment中的代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

for /F "delims=" %%U in ('
    dir /Q /A:D "%~1" ^| find "<DIR>" ^| findstr /V /R /C:" \.*\.$"
') do (
    set "ITEM=%%U"
    setlocal EnableDelayedExpansion
    set "ITEM=!ITEM:*<DIR>=!" & set "ITEM=!ITEM:*\=!"
    for /F "tokens=1,* delims= " %%O in ("!ITEM!") do (
        endlocal
        ECHO ren "%~dp1%%P" "%%O"
        setlocal
    )
    endlocal
)

endlocal
exit /B

要使用此脚本,请提供包含要重命名的目录作为命令行参数的目录 - 例如,假设该目录名为parent-folder

rename-dir-by-owner.bat "parent-folder"

大写ECHO命令用于测试目的;在您真正想要重命名任何项目时立即将其删除。

解释

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

 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

find命令过滤掉所有不包含<DIR>(标记目录)的行,findstr删除虚拟目录.(当前)和{{1 (父)。因此,以下几行仍然存在:

..

这些行由外部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 循环捕获,每个循环都存储在变量for /F中。然后删除部分ITEM之前的所有内容,然后切断(第一个)<DIR>之前的所有内容。 \的剩余内容现在使用另一个ITEM循环进行解析,该循环将提取第一个空格前面的所有内容,以便检索所有者的用户名;白色空格后面是目录名称。两个字符串部分最终都会传递给for /F命令(一旦ren离开)。

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