我有大量文件(> 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
}
}
答案 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 /?
)