重命名文件夹,并与现有文件夹合并(如果Powershell中存在该文件夹)

马克

尝试进行一些目录清理,并从旧方法过渡到新方法。目前,我们一直在逐案进行手动操作,但是我决定考虑使流程自动化

从理论上讲,这一直有效,直到我们开始提取更多CSV数据并遇到新问题为止。

我在任何地方都找不到答案,就是“重新命名文件夹,如果名称存在,则将两者合并”,就像在Windows资源管理器中看到的一样:

我知道这很危险-但这是我想到的唯一方法。

调查了一下, Copy-Item但是由于文件夹的范围从一路到几MB到>20GB(平均来说更大的那一侧)。复制,移动子项然后删除都太慢了,再加上约8000个文件夹来创建和移动,我认为缓冲区存储不足。

是否可以将文件夹和子文件夹合并到新创建的文件夹中?

这是我到目前为止所拥有的:

# set the working directory
Set-Location "B:\"

# import the CSV file for folder creation
$folders = Import-Csv -Delimiter "," -Header @("ID","caseName","caseNumber") -Path .\export.csv

# begin the loop
ForEach( $folder in $folders ) {

   # create the variables
   $columnID = $folder.ID
   $columnCase = "{0} {1}" -f $folder.caseName, $folder.caseNumber
   $columnNewCase = "{1}, {0}" -f $folder.caseName, $folder.caseNumber

   # use later to create root folders
   $yearAllocation = "20{0}" -f $folder.caseNumber.Substring(0,2)


   #
   # // MARK: begin main folder creation
   #

   # "SMITH 12345678" and "12345678, SMITH" do NOT exist
   if( (-not ( Test-Path "$columnCase" )) -and (-not ( Test-Path "$columnNewCase" )) ) {
       # create the "12345678, SMITH"
       New-Item "$columnNewCase" -ItemType Directory
   }

   # "SMITH 12345678" EXISTS but "12345678, SMITH" does NOT exist
   if( ( Test-Path "$columnCase" ) -and (-not ( Test-Path "$columnNewCase" )) ) {
       # rename "SMITH 12345678" -> "12345678, SMITH"
       Rename-Item "$columnCase" -NewName $columnNewCase -Force
   }

   # "SMITH 12345678" does NOT exist but "12345678, SMITH" EXISTS
#   if( (-not ( Test-Path "$columnCase" )) -and ( Test-Path "$columnNewCase" ) ) {
#      # do nothing
#   }

   # "SMITH 12345678" and "12346578, SMITH" both EXIST
   if( ( Test-Path "$columnCase" ) -and ( Test-Path "$columnNewCase" ) ) {
       # merge "SMITH 12345678" -> "12345678, SMITH"
   }


   #
   # // MARK: begin ID folder moves
   #

   # if "98765" folder exists
   if( Test-Path "$columnID" ) {
       # move "98765" into "12345678, SMITH"
       Move-Item "$columnID" -Destination "$columnNewCase"
   }
} 

最后,我希望我们能得到目前看起来像这样的东西:

B:\
- 12345
- 23445
- 63574
- 73363
- SMITH 12345678
- JONES 58478945

变成:

B:\
- 12345678, SMITH
--- 12345
--- 23445
- 58478945, JONES
--- 63574
--- 73363

如果有人不小心创建了新的手动文件夹:

B:\
- 12345678, SMITH
--- 12345
--- 23445
- 58478945, JONES
--- 63574
--- 73363
- SMITH 12345678
--- 66684

然后重新运行脚本将很简单:

B:\
- 12345678, SMITH
--- 12345
--- 23445
--- 66684
- 58478945, JONES
--- 63574
--- 73363
马克

事实证明,在Powershell中无法合并文件夹。

我最终通过扫描原始文件夹中的所有子文件夹并将它们移到新的目标位置来解决了该问题。

作为预防措施,然后将原始文件夹移动到另一个目标位置,以便我们可以检查文件大小属性是否有遗漏。

# set the working directory
Set-Location "C:\"

# import the CSV file for folder creation
# create the headers for the file since CSVs dont have them
$csvRows = Import-Csv -Delimiter "," -Header @("ID","name","number") -Path .\file.csv

# begin the loop
    ForEach( $csvRow in $csvRows ) {

    # create the variables
    $columnID = $csvRow.ID
    $columnNameNumber = "{0} {1}"  -f $csvRow.name, $csvRow.number
    $columnNumberName = "{1}, {0}" -f $csvRow.name, $csvRow.number


    #
    # // MARK: begin main folder creation
    #

    # "SMITH 12345678" and "13246578, SMITH" do NOT exist
    if( (-not ( Test-Path "$columnNameNumber" )) -and (-not ( Test-Path "$columnNumberName" )) ) {
        # create the "12345678, SMITH"
        New-Item "$columnNumberName" -ItemType Directory
    }

    # "SMITH 12345678" EXISTS but "13246578, SMITH" does NOT exist
    if( ( Test-Path "$columnNameNumber" ) -and (-not ( Test-Path "$columnNumberName" )) ) {
        # rename "SMITH 12345678" -> "12345678, SMITH"
        Rename-Item "$columnNameNumber" -NewName $columnNumberName -Force
    }

    # "SMITH 12345678" does NOT exist but "13246578, SMITH" EXISTS
    if( (-not ( Test-Path "$columnNameNumber" )) -and ( Test-Path "$columnNumberName" ) ) {
        # do nothing
    }

    # "SMITH 12345678" and "13246578, SMITH" both EXIST
    if( ( Test-Path "$columnNameNumber" ) -and ( Test-Path "$columnNumberName" ) ) {
        # find all the items in $columnNameNumber
        $subDirectory = Get-ChildItem $columnNameNumber -Name

        # loop through and move to $columnNameNumberNew
        ForEach( $childItem in $subDirectory ) {
            Move-Item "$columnNameNumber\$childItem" -Destination "$columnNumberName"
        }

        # rename to know its done
        if( ( Test-Path .\destination ) ) {
            Move-Item "$columnNameNumber" -Destination .\destination
        }
    }


    #
    # // MARK: begin ID folder moves
    #

    # if "98765" folder exists
    if( Test-Path "$columnID" ) {
        # move "98765" into "12345678, SMITH"
        Move-Item "$columnID" -Destination "$columnNumberName"
    }
}

希望这对以后的人有所帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果文件存在,则使用sequencenumber重命名文件夹中的所有文件

重命名文件夹中的所有文件也重命名子文件夹

重命名文件夹中的文件

重命名文件夹中的文件

遍历文件夹并使用文件夹名称顺序重命名每个文件夹中的所有文件

批。批量重命名文件夹和所有子文件夹中的文件

在Python中重命名文件夹

重命名Bash文件夹中的所有文件

重命名文件夹中的所有文件

python重命名文件夹中的所有文件

在git中合并重命名的文件夹

使用文件夹名称重命名文件夹中的所有图像

重命名子文件夹中的PowerShell错误

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

重命名提取文件的文件夹

重命名文件目录文件夹

重命名文件夹中的所有 .csv

重命名目录中的所有文件夹

如果匹配文件的内容,则重命名大量文件夹

如何使用批处理脚本重命名在该文件夹中具有一定数量文件的多个文件夹?

重命名一个文件夹的文件夹中的文件到其父文件夹?

合并(子模块?)到现有文件夹中

重命名文件夹中的所有文件,并使用PowerShell将名称替换为creationTime

如果文件夹为空,则重命名文件夹的脚本

即使此目标文件夹已经存在,如何重命名文件夹?

在文件夹,子文件夹和多个文件中递归查找和重命名

使用父文件夹的名称重命名子文件夹中的文件

python:通过子文件夹名称重命名子文件夹中的文件

使用子文件夹标签重命名子文件夹中的文件