批处理或Powershell:归档具有相似名称的文件

时间:2016-07-07 06:35:18

标签: powershell batch-file

我有大量文件(> 30K),这些文件都存储在一个目录中,需要重新组织和存档。

文件命名为(非时间顺序):

  
      
  • M056811-01-.TXT
  •   
  • M056811-02-.TXT
  •   
  • M056811-03-.TXT
  •   
  • M956782-01-.TXT
  •   
  • M956782-02-.txt ...
  •   

我想将属于一起(具有相同前缀)的文件存档到一个zip文件中。哪会导致:

  
      
  • M056811.zip
  •   
  • M956782.zip ...
  •   

有没有办法通过一些Batch或Powershell脚本来实现这一点。

我在编写脚本方面不是很先进。除了答案本身(如果有解决方案),我真的很想知道它有效。

我的最终解决方案(非常感谢David Brabant):

我编辑了远程目录使用的脚本。没有必要将脚本放在同一个目录中。只需编辑前两个变量就可以了。

$dirpath = "<Enter Directorypath here>"
$offsetlength = 6

$pathlength = $dirpath.Length
$absolutelength = $pathlength + $offsetlength


dir $dirpath | group  { $_.FullName.Substring(0, $absolutelength) } | %{
    $subset = $_

    $subset.Group | %{
        Compress-Archive $_ $subset.Name -Update
    }
}

2 个答案:

答案 0 :(得分:1)

您可以在PowerShell中开始使用。它假定您使用的是PowerShell 5(适用于Compress-Archive cmdlet)。

$dirpath = "D:\temp"

dir $dirpath | group  { $_.Name.Substring(0, 8) } | %{
    $subset = $_

    $subset.Group | %{
        Compress-Archive $_ $subset.Name -Update
    }
}

答案 1 :(得分:0)

您可以使用通配符。 “{1}}表示”任意字符“,?表示”一个或多个字符“。这称为“文件掩码”,例如*

M000001-??-.txt

您的zip应用程序很可能也支持文件掩码,因此您可以执行类似的操作(语法在很大程度上取决于您使用的应用程序 - 请参阅您的文档):

dir "M000001-??-.txt"
dir "M000001*.txt"
dir "M000001*.*"

嗯,这很容易。现在处理所有文件。你有一个共同的前缀(ZipApp.exe /zip "M000001-??-.txt" "M000001.zip" ),它允许你使用一个简单的计数器(M000xxx),添加足够的前导零,从中获取最后6个字符,最后在前面添加另一个“M”它。这样,您就可以轻松构建文件掩码和zip文件名。

for /L

您需要delayed expansion来处理@echo off setlocal enabledelayedexpansion for /l %%i in (1,1,10) do ( set "n=0000000%%i" set "n=M!n:~-6!" echo Mask="!n!-??-.txt" Zipfile="!n!.zip" ) 循环中的变量。

使用正确的参数语法执行您的zip应用程序而不是for行。 (无法帮助你 - 看看它的文档)

如果您对命令不确定,请参阅echo的帮助(例如command /?for /?