如何使用 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 递归删除具有特定名称的文件夹?

Excel动态下拉列表按过滤表

如何按名称过滤键,然后使用 jq 访问嵌套对象

如何按名称和列表过滤vue中的数组

Powershell Array Strings - 在 SSIS 中映射不同的变量参数名称

powershell 包含不工作