重命名文件夹,子文件夹和文件

时间:2016-01-06 20:05:01

标签: batch-file cmd batch-rename

我是编码/编程的新手,并尝试创建一个简单的robocopy例程,自动将模板项目文件夹从一个位置复制到主项目驱动器,然后重命名该文件夹的“00-000”部分(始终位于名称的开头)并包含基于用户指定变量的子文件夹和文件。这是我的robocopy程序的样子。

echo off
robocopy "C:\Program Files\Autodesk\ACAD_Config\00-000-NewProject" "T:\Projects" /xd Dfsrprivate /s /e /W:0 /xd DfsrPrivate /r:0 /np

重命名部分是我迷路的地方。在T:\驱动器上创建 00-000-NewProject 文件夹后,应该重命名该文件夹并包含子文件夹和文件。

例如,

  1. 例程提示设置 variableA “输入项目编号:”
  2. 用户输入 variableA 定义,“EP-001”
  3. 例程验证即将进行的更改“所有文件夹和文件的项目编号将重命名为:'EP-001'是否正确Y / N?”“(y =确认更改并继续执行步骤4 .n =重新输入项目编号)
  4. 此例程用 VariableA
  5. 替换00-000-NewProject文件夹中包含的任何(00-000)实例

    我的想法可以用于Windows CMD吗?我想避免安装任何第三方应用程序,因为更新和维护可能会在一个100人的公司中变得毛茸茸。任何帮助将不胜感激,但任何建议的代码的进一步解释将最有助于教我自己如何编程。提前谢谢!

2 个答案:

答案 0 :(得分:0)

我相信这是你要做的,但正如@Guildencrantz所提到的,你可能需要进一步澄清你的项目结构,文件,你的意思是文件名,目录等等。

批处理文件示例

要使用,请将d:\ test重命名为t:目录,删除echo语句以执行命令等。

@echo off
setlocal enabledelayedexpansion
set variableA=EP-001
set newfolder=%variableA%-NewProject
echo robocopy "C:\Program Files\Autodesk\ACAD_Config\00-000-NewProject" "D:\test\Projects\%newfolder%" /xd Dfsrprivate 

::: rename all files under T:\Projects\%newfolder% that start with 00-000 prefix with the variableA prefix

for /r D:\test\Projects\%newfolder%\ %%f in (*) do (
::: @echo Found: %%f 
set newname=%%f
call set newname=!newname:00-000=%variableA%!
@echo ren %%f !newname!
)
endlocal

示例输出:

D:\test>rename1.cmd
robocopy "C:\Program Files\Autodesk\ACAD_Config\00-000-NewProject" "D:\test\Projects\EP-001-NewProject" /xd Dfsrprivate
ren D:\test\Projects\EP-001-NewProject\00-000-one.txt D:\test\Projects\EP-001-NewProject\EP-001-one.txt
ren D:\test\Projects\EP-001-NewProject\00-000-two.txt D:\test\Projects\EP-001-NewProject\EP-001-two.txt

答案 1 :(得分:0)

我看到这是旧的。现在可能没关系,但解决这个问题很有意思。困难的地方是将目录从最远的叶子重命名为根目录。

$project_base = 'C:/src/t/bn'
$template_dir = "$($project_base)/00-000-NewProject"

$project_name_approved = $false
do {
    $pn = Read-Host 'Please enter the new project name'
    $new_project_dir = "$($project_base)/$($pn)-NewProject"

    if (Test-Path -Path $new_project_dir) {
        Write-Host "Project $($pn) already exists. Please choose another project name."
    } else {
        $ap = Read-Host "Rename new project to $($pn)? (Y/N)"
        if ($ap -match '^y') { $project_name_approved = $true }
    }
} until ($project_name_approved)

# Create the new project directory and copy template files
New-Item -ItemType Directory -Path $new_project_dir | Out-Null
Copy-Item  -Path "$($template_dir)\*" -Destination $new_project_dir -Recurse -Exclude DfsrPrivate

# Rename directories first, from the longest leaf in the tree back to the shortest
$dir_names = Get-ChildItem -Recurse -Directory -Path $new_project_dir |
    Sort-Object -Property Length -Descending |
    ForEach-Object {
        $fn = Split-Path $_ -Leaf
        if ($fn -match '^00-000') {
            Rename-Item -Path $_.FullName -NewName "$($fn -replace '^00-000', $pn)"
        }
    }

Get-ChildItem -Path $new_project_dir -File -Recurse |
    ForEach-Object {
        Rename-Item -Path $_.FullName -NewName $($_.Name -replace '00-000', $pn)
    }