我在$ src中有数百个文件,其命名约定如下:
我正在尝试对名称中具有相同值的文件进行分组,并将文件传输到每个组的单独.zip存档。到目前为止,我已设法显示我的正则表达式模式匹配的所有文件。但现在我不知道如何精确定位正则表达式相同的那些。
在收集来自SO和其他来源的信息后,我现在就在这里:
$src = "D:\05_Tools\powershell_scripts\testbin\"
$tgt = "D:\05_Tools\powershell_scripts\testbin\output"
$filter = [regex] "_(\d*)999"
$allfiles = Get-ChildItem $src | Where-Object { $_.Name -match $filter } | Copy-Item -Destination $tgt
(复制cmdlet仅用于测试目的,将由压缩替换)作为初学者,如果您能提供正确方向的提示,我将非常感激。
答案 0 :(得分:2)
如果您使用的是Powershell版本5,则可以执行以下操作:
Get-ChildItem *.txt | % {
$zip = ($_.Name -replace '^[^_]+_\d+_(\d{6}).+$', '$1') + '.zip'
Compress-Archive $_.FullName $zip -Update
}
这只是使用正则表达式来获取将创建zip文件名的文件名部分。关键是-Update
参数,如果它不存在,将创建zip或如果它存在则添加文件。
如果您没有Powershell版本5,那么只需安装命令行zip实用程序,例如7-zip。然后,您可以通过调用zip实用程序替换Compress-Archive
。您将不得不参考它的文档来进行类似的更新(它可能被称为追加)。
答案 1 :(得分:0)
下一个脚本适用于Powershell 4:
$src = 'D:\test\SO\41087896' # my debugging value
$filter = [regex] "_(\d*)999"
$allfiles = Get-ChildItem $src -File |
Where-Object { $_.BaseName -match $filter} |
Group-Object -Property {if( $_.BaseName -match $filter) { $Matches[0]}}
$allfiles | Format-Table -AutoSize -Wrap
for ( $ii = 0; $ii -lt $allfiles.Count ; $ii++ ) {
$zipname = $allfiles[$ii].Name
write-host "group $zipname" -ForegroundColor Cyan
### ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ debugging output
$allfiles[$ii].Group | Format-Table -AutoSize -HideTableHeaders
### ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ debugging output
### debugging output shows that each $allfiles[$ii].Group
### is an object of type System.IO.FileSystemInfo
### and could be piped to a compressing utility
}
输出(图片似乎更具说明性)
修改:将$zipname
字符串缩小为以粗体显示的文字(即问题中的 012016 和 022016 ),下一个作业而不是$zipname = $allfiles[$ii].Name
:
$zipname = $allfiles[$ii].Name.Substring( 1, $allfiles[$ii].Name.Length-4)
使用下一个代码段创建调试环境:
$src = 'D:\test\SO\41087896'
'prefix_123456_012016999.txt',
'prefix0_123456_012016999.txt',
'prefix1_123456_012016999.txt',
'prefix_123456_022016999.txt',
'prefix0_123456_022016999.txt',
'prefix1_123456_022016999.txt' |
ForEach-Object {
New-Item -Path (
Join-Path -ChildPath $_ -Path $src
) -ItemType File -ErrorAction SilentlyContinue |
Out-Null
}
### create debugging environment - end