如何使用 PowerShell 获取部分文件名列表和 return 完整文件名列表
How to take a list of partial file names and return a list of the full file names with PowerShell
我想知道如何使用 PowerShell 获取部分文档名称列表和 return 完整文档名称列表。
我有大量文件需要处理。我们有一个命名方案:HG-xx-xx-###
实际文件的完整命名方案是:HG-xx-xx-###.x.x_File_Name
我有很多不同的文件名列表,如下所示:
HG-SP-HG-001
HG-WI-BE-005
HG-GD-BB-043
我正在尝试让程序 return 成为完整文件名的列表,如下所示:
HG-SP-HG-001.1.6_Example
HG-WI-BE-005.1.0_Example
HG-GD-BB-043.1.1_Example
我已经包含了我尝试过的两种方法。我给它一个列表,甚至只是一个部分文件名,但我什么也没得到。
我已经尝试了两种不同的方法,但我的编程和谷歌搜索能力已经到了尽头,有什么想法吗?
$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
使用带有部分名称的过滤器时,您需要指定通配符
$names = 'HG-SP-HG','HG-WI-BE','HG-GD-BB'
$names | Foreach-Object {
Get-ChildItem -File -Filter $_* -Recurse
}
如果您只想返回完整路径,只需 select 它即可。
$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
参数,它接受 多个 模式,因此您可以获得离开 one Get-ChildItem
call.
虽然对于单个 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
如果您已经确定了文件的外观模式,为什么不用正则表达式呢?
# 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次
我想知道如何使用 PowerShell 获取部分文档名称列表和 return 完整文档名称列表。
我有大量文件需要处理。我们有一个命名方案:HG-xx-xx-###
实际文件的完整命名方案是:HG-xx-xx-###.x.x_File_Name
我有很多不同的文件名列表,如下所示:
HG-SP-HG-001
HG-WI-BE-005
HG-GD-BB-043
我正在尝试让程序 return 成为完整文件名的列表,如下所示:
HG-SP-HG-001.1.6_Example
HG-WI-BE-005.1.0_Example
HG-GD-BB-043.1.1_Example
我已经包含了我尝试过的两种方法。我给它一个列表,甚至只是一个部分文件名,但我什么也没得到。
我已经尝试了两种不同的方法,但我的编程和谷歌搜索能力已经到了尽头,有什么想法吗?
$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
使用带有部分名称的过滤器时,您需要指定通配符
$names = 'HG-SP-HG','HG-WI-BE','HG-GD-BB'
$names | Foreach-Object {
Get-ChildItem -File -Filter $_* -Recurse
}
如果您只想返回完整路径,只需 select 它即可。
$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
参数,它接受 多个 模式,因此您可以获得离开 one Get-ChildItem
call.
虽然对于单个 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
如果您已经确定了文件的外观模式,为什么不用正则表达式呢?
# 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次