按名称(可变的最后一个字母)将文件移动到文件夹

时间:2019-02-13 07:29:41

标签: powershell

我们有一个系统在工作,如果创建新版本,我们将更改文件名的最后一个字母。我们将其按字母顺序更改,O是第一个,然后是A,B,C,... enter image description here

但是较旧的版本不再需要保留在该文件夹中。我正在寻找Powershell中的“ simpel”解决方案,以将这些较旧的文件移至“ old”文件夹中。

我不知道如何在Powershell中启动(除非移至正确的文件夹),也不知道是否有可能。 任何建议都可以帮助您。

Set-Location -Path "Z:\PDF\2018\18-00190 StBV THV Depret Franki\2D"
Get-ChildItem | Sort-Object -Property name

1 个答案:

答案 0 :(得分:2)

在PowerShell中,您往往需要处理很多管道,创建对象序列,并在此过程中进行过滤,投影或其他操作。您的问题可以通过以下几个步骤来解决(无论它们是否简单还是有待观察,但您的需求需要一些自定义代码):

  1. 首先按基本文件名将所有文件分组(不带后缀)

    Get-ChildItem -File | Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' }
    

    这将创建一个分组密钥,该分组密钥基本上是没有最后更改后缀的文件名。然后,每个组都有为该文件创建的所有修订。例如。对于文件名1409-EM-M-PL-7000_A.dwg.pdf,您将得到一个名为1409-EM-M-PL-7000.dwg.pdf的组,其中包含该文件的所有版本。

    我在这里假设实际上不会使用O之后的字母,但是如果需要,您可以改写正则表达式。

  2. 按顺序对修订进行排序:

    ForEach-Object {
        $_.Group | Sort-Object { $_.Basename -creplace '_O(?=$|\.)', '_0' } -Descending
    }
    

    我们暂时将_O替换为_0,以便在此处排序以得到正确的顺序,因为它是最早的版本,但通常会显示为最新版本。

    我们还在此处进行降序排序(因此我们首先获得了最新版本),以使下一步变得更容易,因为我们实际上是想获取必须移动的文件,而不是想要保留的文件。

  3. 在这种情况下,通过抓取除 以外的每个文件的最新3个文件来保留最新的 n 版本:

    Select-Object -Skip 3
    
  4. 将其余文件移动到old

    Move-Item -Destination old
    

将它们放在一起:

Get-ChildItem -File |
  Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' } |
  ForEach-Object {
    $_.Group |
      Sort-Object { $_.Basename -creplace '_O(?=$|\.)', '_0' } -Descending |
      Select-Object -Skip 3
  } |
  Move-Item -Destination old

-WhatIf上粘贴MoveItem,以查看正在执行的操作,而无需实际更改任何内容。例如:

H:\Stuff\54664753> ls

    Directory:  H:\Stuff\54664753

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-----       2019-02-13     10:10        1   old
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_A.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_B.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_C.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_D.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_O.dwg.pdf
-a----       2019-02-13     10:11        0   file2_A.pdf
-a----       2019-02-13     10:11        0   file2_O.pdf
-a----       2019-02-13     10:11        0   file3_O.xml
-a----       2019-02-13     10:11        0   file_A.txt
-a----       2019-02-13     10:11        0   file_B.txt
-a----       2019-02-13     10:11        0   file_C.txt
-a----       2019-02-13     10:11        0   file_O.txt

H:\Stuff\54664753> Get-ChildItem |
>>>   Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' } |
>>>   ForEach-Object {
>>>     $_.Group |
>>>       Sort-Object { $_.Basename -creplace '_O(?=$|\.)', '_0' } -Descending |
>>>       Select-Object -Skip 2
>>>   } |
>>>   Move-Item -Destination old -Whatif
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\1409-EM-M-PL-7000_B.dwg.pdf Destination: H:\Stuff\54664753\old\1409-EM-M-PL-7000_B.dwg.pdf".
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\1409-EM-M-PL-7000_A.dwg.pdf Destination: H:\Stuff\54664753\old\1409-EM-M-PL-7000_A.dwg.pdf".
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\1409-EM-M-PL-7000_O.dwg.pdf Destination: H:\Stuff\54664753\old\1409-EM-M-PL-7000_O.dwg.pdf".
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\file_A.txt Destination: H:\Stuff\54664753\old\file_A.txt".
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\file_O.txt Destination: H:\Stuff\54664753\old\file_O.txt".

您还可以尝试通过适当缩短管道来尝试各个步骤,例如仅初始分组:

H:\Stuff\54664753> Get-ChildItem |
>>>   Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' }

Count Name                      Group
----- ----                      -----
    1 old                       {old}
    5 1409-EM-M-PL-7000.dwg     {1409-EM-M-PL-7000_A.dwg.pdf, 1409-EM-M-PL-7000_B.dwg.pdf, 1409-EM-M-PL-7000_C.dwg.pdf, 1409-EM-M-PL-7000_D.dwg.pdf...}
    2 file2                     {file2_A.pdf, file2_O.pdf}
    1 file3                     {file3_O.xml}
    4 file                      {file_A.txt, file_B.txt, file_C.txt, file_O.txt}

或分组和排序,但其余部分则没有:

H:\Stuff\54664753> Get-ChildItem -File |
>>>   Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' } |
>>>   ForEach-Object {
>>>     $_.Group |
>>>       Sort-Object { $_.Basename -creplace '_O(?=$|\.)', '_0' } -Descending
>>>   }

    Directory:  H:\Stuff\54664753

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_D.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_C.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_B.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_A.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_O.dwg.pdf
-a----       2019-02-13     10:11        0   file2_A.pdf
-a----       2019-02-13     10:11        0   file2_O.pdf
-a----       2019-02-13     10:11        0   file3_O.xml
-a----       2019-02-13     10:11        0   file_C.txt
-a----       2019-02-13     10:11        0   file_B.txt
-a----       2019-02-13     10:11        0   file_A.txt
-a----       2019-02-13     10:11        0   file_O.txt