繁体   English   中英

使用 Get-ChildItem 根据文件名内的数字范围选择文件夹内的文件范围。

[英]Using Get-ChildItem to select a range of files within a folder based on a numerical range within the file name.

我目前在使用某些复制软件时经常遇到问题,需要我根据文件名手动发送一些文件,并且由于远程访问站点的速度缓慢,我正在尝试找到一种自动化方法。

示例 - 特定文件夹包含许多格式为 X123456-000123-X.XML 的文件。 '000123' 是文件名中唯一会逐渐变化和增加的部分。 我可能会收到检索文件的请求,如下所示:

起始文件:X123456-000123-X.XML 最后文件:X123456-000150-X.XML

这些文件可能位于可以忽略的数千个其他文件的中间。 我的 Powershell 技能是合理的,但我的 RegEx 不是,这让我无法找到解决方案。 您可以提供的任何帮助或想法将不胜感激!

将匹配 120-159 的内置范围通配符1[2-5][0-9]Where-Object以检查通过正则表达式或简单字符串拆分提取的实际数字:

Get-ChildItem 'X123456-0001[2-5][0-9]-X.XML' | where {
    $index = [int]$_.Name.Split('-')[1]
    $index -ge 123 -and $index -le 150
}

如果事先不知道范围,第一个通配符将是*例如'X123456-*-X.XML'


另一种方法是通过指定范围 (123-129, 130-149, 150) 来分而治之:

gci 'X123456-00012[3-9]-X.XML', 'X123456-0001[3-4][0-9]-X.XML', 'X123456-000150-X.XML'

您可以编写一个通用函数,为两个任意数字构建这样的通配符数组。

如果文件名和序列是可预测的,您可能可以从头开始生成它,而不是列出数千个文件并尝试解析结果并过滤它们:

 $FileNames = 123..150 | ForEach { 'X123456-{0:D6}-X.XML' -f $_ }

那是字符串格式化,最多将数字填充六位; 它将产生一个数组,如:

X123456-000123-X.XML
X123456-000124-X.XML
X123456-000125-X.XML
...

一个更简单的版本...

123..150 | % {Get-ChildItem X123456-000$_-X.XML}

$_ 将扩展为每次从管道中获得的数字。

如果您希望始终在文件名的左侧填充一些 ceros,那么下面的这个版本是更好的解决方案。

123..150 | %{([string]$ ).PadLeft(6,"0")} | % {Get-ChildItem X123456-$ -X.XML}

或者你可以使用“;” 避免为相同范围的数字循环 2 次

123..150 | %{$num = ([string]$_).PadLeft(6,"0"); Get-ChildItem X123456-$num-X.XML}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM