[英]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.