如何使用 PowerShell 按名称过滤具有不同扩展名文件的文件?
Posted
技术标签:
【中文标题】如何使用 PowerShell 按名称过滤具有不同扩展名文件的文件?【英文标题】:How to filter a file by name file with different extension file using PowerShell? 【发布时间】:2020-03-30 02:24:06 【问题描述】:我有一些具有不同扩展名的文件。 喜欢这个文件
file123_A1.que
file456_B2.que
file123_00_A1.pro
file890_11_C2.pro
我想在 lastwritetime 之前复制文件。但是如果文件已经有.pro,我不想复制文件,即使文件是lastwritetime。
例如,按 lastwritetime 对文件进行排序后,将复制的文件是 file123_A1.que
,但该文件名已经具有 .pro 通过识别最后的 2 个文件名 A1
。所以在这种情况下,我需要复制另一个文件。
我的期望是,如果文件具有相同的 2 个姓氏但扩展名文件不同(例如:file123_A1.que 和 file123_00_A1.pro 相同的 2 个姓氏文件名。我不会复制此文件 file123_A1.que)
任何人都可以提供想法。谢谢 我试过这个
$Sel_JobFolder = "D:\601"
$JobFolder = @(Get-ChildItem "$Sel_JobFolder\*.que" | Sort-Object LastWriteTime)[0] |
ForEach-Object Copy-Item -path $_.FullName -destination .\ -force
【问题讨论】:
【参考方案1】:您可以采取的一种方法是:
获取所有带有Get-ChildItem
的文件,并按扩展名降序排序。所以这意味着.que
将出现在.pro
文件之前。我们可以在这里使用Sort-Object
对计算出的属性进行排序,该属性使用System.IO.Path.GetExtension()
提取扩展名,同时确保我们将Descending = $true
设置为按降序排序。
将文件添加到哈希表,其中键是通过"_"
拆分文件名的最后一项,例如密钥将从file123_A1
变为A1
。如果找到的话,这里的想法是用.pro
文件替换.que
文件。
迭代哈希表并复制最新文件。如果找到.pro
文件,则将复制它而不是.que
文件。如果没有找到.pro
文件,那么我们将复制.que
文件。
演示:
$directory = "D:\601"
# sort files by extension in descending order
$files = Get-ChildItem -Path $directory | Sort-Object -Property @Expression = [System.IO.Path]::GetExtension($_); Descending = $true
# add files to hashtable. .que will be updated by .pro if found
$ht = @
foreach ($file in $files)
$key = $file.BaseName.Split("_")[-1]
$ht[$key] = $file.FullName
# copy files here
foreach ($entry in $ht.GetEnumerator())
Copy-Item -Path $entry.Value -Destination .\
这会将以下文件复制到您当前的工作目录.\
:
D:\file456_B2.que
D:\file890_11_C2.pro
D:\file123_00_A1.pro
在这里我们可以看到file123_A1.que
被排除在复制之外,因为file123_00_A1.pro
替换了它。
【讨论】:
以上是关于如何使用 PowerShell 按名称过滤具有不同扩展名文件的文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PowerShell 递归删除具有特定名称的文件夹?