我有一个脚本,我写在我的公司清理Citrix UPM配置文件。不太复杂,但它为运行在其上的每个用户生成日志。按照下列格式:
0733重置-e0155555-20150112-0733
1128重置-n9978524-20150114-1128
0840重置-jsmith-20150113-0840
等。
因此,我想抓取文件夹与所有的.txt文件,只选择用户名和计数,看看一个是否出现超过一定次数。检查有问题的孩子。将它们放入数组是很容易的,但是在执行-split时,我似乎找不到正则表达式组合来选择用户名。我以为我可以做一个('-')1,但这似乎行不通。你有什么意见建议?
$arrFiles = Get-Childitem "c:\logs"
$arrFiles | %{ $arrfile = $_ -split ('-'); Write-Host $arrfile[0]}编辑:为了子孙后代,包括测试代码。
发布于 2015-04-23 13:17:33
我会尝试这样的方法:
$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返回的对象之一。这些对象不是字符串。它们是.Net对象,类型为System.IO.DirectoryInfo或System.IO.FileInfo。这意味着如果我们使用$_,我们将引用整个对象。更糟糕的是,这两个对象都没有Split()方法,所以$_.Split('-')会引用一个不存在的函数。
BaseName是FileInfo或DirectoryInfo对象的属性。该属性包含没有路径或扩展名的文件名。关键的是,这个属性也是一个字符串,它有Split()方法。所以使用这个属性可以做两件事:它删除路径名和扩展,因为我们不关心它,我们不希望它可能破坏某个东西(例如,如果有人在父文件夹的名称中放了一个破折号),它给了我们一个String对象,我们可以使用String方法操作它,并执行类似调用拆分函数的事情。
在命令行中尝试这样的操作:
$x = Get-ChildItem 'N:\Folder\UPMreset-e0155555-20150112-0733.txt';
$x | Get-Member;您将得到对象可以执行的大量方法(函数)列表和对象的属性(属性值)。名称、FullName、BaseName和扩展都是非常常用的属性。您还应该看到NoteProperties和CodeProperties,它们是由PowerShell提供程序添加的,以使它们更容易使用(它们在C#程序中是不可用的)。定义告诉您如何调用该方法或属性的类型以及您可以使用它做什么。对于如何使用MSDN文档,您通常可以使用Google和MSDN文档,尽管这并不总是最简单的方法。
将上面的内容与此进行比较:
$x.BaseName | Get-Member;您可以看到它是一个字符串,有各种各样的方法,比如拆分、替换、IndexOf等等。
另一个有用的办法是:
$x | Select-Object *;这将返回该对象所具有的所有Propety、NoteProperty和CodeProperty值。
这突出了学习如何处理对象的最佳方法之一。将其导入Get-Member,您将了解可以访问的类型和任何方法或属性。再加上将一些东西输送到Select-Object *,可以告诉您您正在使用的是什么。
发布于 2015-04-23 13:09:47
你对.split('-')[1]有什么问题?
$filenames = @(
'UPMreset-e0155555-20150112-0733',
'UPMreset-n9978524-20150114-1128',
'UPMreset-jsmith-20150113-0840'
)
$filenames |% {$_.split('-')[1]}
e0155555
n9978524
jsmith发布于 2015-04-23 13:04:46
看起来文件名总是UPMreset-,后面跟着用户名。所以请使用这个:
UPMreset-(.+?)-
捕获组将包含用户名。它使用一个懒惰的量词来得到任何东西,直到下一个破折号。
https://stackoverflow.com/questions/29824188
复制相似问题