如何使用PowerShell获取部分文件名列表并返回完整文件名列表

问题描述

我想知道如何使用PowerShell提取部分文档名称列表并返回完整文档名称列表。

我有很多文件可以做到这一点。我们有一个命名方案:HG-xx-xx-###

实际文件的完整命名方案为:HG-xx-xx-###。x.x_File_Name

我有很多不同的文件名列表,如下所示:

HG-SP-HG-001

HG-WI-BE-005

HG-GD-BB-043

我正在尝试让程序返回完整文件名的列表,如下所示:

HG-SP-HG-001.1.6_示例

HG-WI-BE-005.1.0_示例

HG-GD-BB-043.1.1_示例

我已经包括了我尝试过的两种方法。我给它一个列表,甚至只是一个部分文件名,我什么也没回来。

我尝试了两种不同的方式,但是我在编程和谷歌搜索功能的最后阶段,有什么想法吗?

$myPath = 'P:\'


$_DocList = READ-HOST "Enter list of document ID's"

$_DocList = $_DocList.Split(',').Split(' ')


#Here I'm not sure if I should do it like so:

$output =

    ForEach($_Doc in $_DocList)
    {
    $find = gci $myPath -Recurse |where{$_.name -contains $($_Doc)}
    Write-Host "$find"
    }

$output | clip


#or like this:

$_DocList | ForEach-Object

{

gci -Path $myPath -Filter $_ -Recurse

       $info = Get-ChildItem $_.FullName | Measure-Object
       if ($info.Count -ne 0) {
              Write-Output "$($_.Name)"
        }
} | clip

解决方法

Doug Maurer's helpful answer显示了基于基于-Filter参数的通配符模式的解决方案。 由于此参数仅接受单个模式,因此必须在循环中将Get-ChildItem -Recurse调用多次调用

但是,由于您使用的是-Recurse,因此可以利用-Include参数,该参数接受多个模式,因此您可以摆脱一个 Get-ChildItem通话。

虽然单个Get-ChildItem调用-Filter的效果要好于-Include,但是单个Get-ChildItem -Include调用带有 array 模式的胜过多个​​Get-ChildItem -Filter调用,尤其是在许多模式下。

# Sample name prefixes to search for.
$namePrefixes = 'HG-SP-HG-001','HG-WI-BE-005','HG-GD-BB-043'

# Append '*' to all prefixes to form wildcard patterns: 'HG-SP-HG-001*',...
$namePatterns = $namePrefixes -replace '$','*'

# Combine Get-ChildItem -Recurse with -Include and all patterns.
# .Name returns the file name part of all matching files.
$names = (Get-ChildItem $myPath -File -Recurse -Include $namePatterns).Name
,

也许是这样吗?

$docList = @('HG-SP-HG-*','HG-WI-BE-*','HG-GD-BB-*')

foreach($item in $docList)
{
    $check = Get-ChildItem -Filter $item P:\ -File
    if($check)
    {
        $check
    }

}
,

也许是这样吗?

$docList = @('HG-SP-HG','HG-WI-BE','HG-GD-BB')
$docList | Get-ChildItem -File -Filter $_ -Recurse | select Name
,

在使用带有部分名称的过滤器时,您需要指定通配符

$names = 'HG-SP-HG','HG-GD-BB'
$names | Foreach-Object {
    Get-ChildItem -File -Filter $_* -Recurse
}

如果只想返回完整路径,只需选择它即可。

$names = 'HG-SP-HG','HG-GD-BB'
$names | Foreach-Object {
    Get-ChildItem -File -Filter $_* -Recurse
} | Select-Object -ExpandProperty FullName
,

如果您已确定文件的外观,为什么不对它进行正则表达式?

# Use these instead to specify a docID 
#$docID = "005"
#pattern = "^HG(-\w{2}){2}-$docID"


$pattern = "^HG(-\w{2}){2}-\d{3}"
Get-ChildItem -Path "P:\" -Recurse |  ?{$_ -match $pattern}

当然,可能有更有效的方法来执行此操作,但对于几千个文件来说,它应该足够快。

编辑:这是正则表达式模式的象形文字的细分。

^从头开始

HG文字字符“ HG”

(-\w{2})

  • (开始分组

  • -文字“-”字符(连字符)

  • \w{2}

    • \w任何单词字符
    • {2}正好2次
  • )分组结束

{2}正好2次

-文字“-”字符(连字符)

\d 0到9之间的任何数字

{3}恰好3次

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...