如何在Powershell中拆分和选择文件名数组?

时间:2015-04-23 12:59:33

标签: regex powershell

我有一个我在公司写的用于清除Citrix UPM配置文件的脚本。不是很复杂,但它会为运行它的每个用户生成日志。沿着格式:

UPMreset-e0155555-20150112-0733

UPMreset-n9978524-20150114-1128

UPMreset-jsmith的-20150113-0840

所以我想抓住包含所有.txt文件的文件夹,只选择用户名和计数以查看是否出现超过一定次数的文件。检查有问题的孩子。将它们放入数组很容易,但是当做一个-split时,我似乎找不到正则表达式组合来只选择用户名。我以为我可以做一个(' - ')[1],但这似乎不起作用。你有什么建议吗?

$arrFiles = Get-Childitem "c:\logs"
$arrFiles | %{ $arrfile = $_ -split ('-'); Write-Host $arrfile[0]}

编辑:包含后代测试代码。

4 个答案:

答案 0 :(得分:3)

您对.split('-')[1]有什么问题?

$filenames = @(
'UPMreset-e0155555-20150112-0733',
'UPMreset-n9978524-20150114-1128',
'UPMreset-jsmith-20150113-0840'
)

$filenames |% {$_.split('-')[1]}

e0155555
n9978524
jsmith

答案 1 :(得分:2)

我会尝试这样的事情:

$Path = 'N:\Folder\*.txt';

Get-ChildItem $Path | 
    ForEach-Object {
        Write-Output $_.BaseName.Split('-')[1];
    } | 
    Group-Object | 
    Where-Object { $_.Count -gt 1 } |
    Sort-Object -Property Name |
    Select-Object Name, Count;

回答这个问题。

$_Get-ChildItem返回的对象之一。这些对象是不是字符串。它们是System.IO.DirectoryInfoSystem.IO.FileInfo类型的.Net对象。这意味着如果我们使用$_,我们就会引用整个对象。更糟糕的是,这两个对象都没有Split()方法,所以$_.Split('-')会引用一个不存在的函数。

BaseName是FileInfo或DirectoryInfo对象的属性。该属性包含没有路径或扩展名的文件的名称。重要的是,此属性也是一个String, 具有Split()方法。所以使用这个属性做了两件事:它删除了路径名和扩展名,因为我们不关心它,我们不希望它有可能破坏某些东西(例如,如果有人在父文件夹的名字中放了一个破折号),它为我们提供了一个String对象,我们可以使用String方法进行操作,并执行调用Split函数。

在命令行中尝试这样的事情:

$x = Get-ChildItem 'N:\Folder\UPMreset-e0155555-20150112-0733.txt';
$x | Get-Member;

您将获得对象可以执行的大量方法(函数)和对象的属性(属性值)。 Name,FullName,BaseName和Extension都是非常常用的属性。您还应该看到NoteProperties和CodeProperties,它们由PowerShell提供程序添加,以便更容易使用它们(它们在C#程序中不可用)。该定义告诉您如何调用该方法或该属性的类型以及您可以使用它做什么。您通常可以通过Google查找MSDN文档以了解如何使用它们,尽管这并不总是最简单的方法。

将上述内容与此进行比较:

$x.BaseName | Get-Member;

你可以看到它是一个String,有各种各样的方法,如Split,Replace,IndexOf等。

另一个有用的是:

$x | Select-Object *;

这将返回此对象具有的所有Propety,NoteProperty和CodeProperty值。

这突出了了解对象可以做什么的最佳方法之一。将其传递给Get-Member,您将了解可以访问的类型和任何方法或属性。结合管道到Select-Object *的东西,可以告诉你很多关于你正在使用的东西。

答案 2 :(得分:1)

文件名似乎始终为UPMreset-,后跟用户名。所以使用这个:

UPMreset-(.+?)-

,捕获组将包含用户名。它使用惰性量词来获取下一个破折号。

答案 3 :(得分:1)

您还可以使用Group-Object在计算属性中进行拆分:

my_nine_patch_image.9.png