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

如何使用PowerShell获取部分文件名列表并返回完整文件名列表,powershell,powershell-5.0,get-childitem,Powershell,Powershell 5.0,Get Childitem,我想知道如何使用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_示例 我已经

我想知道如何使用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

也许是这样的

$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

也许是这样的

$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-WI-BE','HG-GD-BB'
$names | Foreach-Object {
    Get-ChildItem -File -Filter $_* -Recurse
}
如果您只想返回完整路径,只需选择它

$names = 'HG-SP-HG','HG-WI-BE','HG-GD-BB'
$names | Foreach-Object {
    Get-ChildItem -File -Filter $_* -Recurse
} | Select-Object -ExpandProperty FullName
显示了基于基于-Filter参数的通配符模式的解决方案。 由于此参数只接受单个模式,因此必须在循环中多次调用Get-ChildItem-Recurse调用

但是,由于您使用了-Recurse,所以可以利用-Include参数,它接受多个模式,因此您可以只调用一个

虽然对于单个Get-ChildItem调用,Filter的性能优于-Include,但是使用模式数组的单个Get-ChildItem-Include调用可能会优于多个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

如果您已经建立了文件的外观模式,为什么不使用regex呢

# 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}
诚然,可能有更有效的方法来实现这一点,但对于几千个文件来说,速度应该足够快

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

^从头开始

文字字符

-\w{2}

分组开始

-文字字符连字符

\w{2}

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

{2} 正好两次

-文字字符连字符

\d任何数字0到9


{3} 正好3次

此驱动器上有1000多个文件使用命名方案。我只需要从名单中找出名字。我的列表有100多个文档…谢谢,但似乎仍然没有返回任何内容。所有文件都在文件夹中,所以我添加了-Recurse,仍然没有。有趣。我不知道为什么它不起作用。我在本地机器上创建了一些文件,并尝试了一下,它确实找到了。谢谢,但这只会给我一个超过1000个文件的列表。我有80个单独的列表,每个列表有10-100个文件名,我需要完整的文件名。感谢您的回答,尽管Add version2@pevin您只能通过管道路径获取ChildItem您删除了无效的第二个示例,其中您使用了管道文件名。@DougMaurer我删除了带有regexp的示例谢谢您提供的有用答案!很抱歉反应太晚。这对我有用!很高兴听到这有帮助,@pevin;不用担心时间。