首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Powershell中的文件名数组中拆分和选择?

如何从Powershell中的文件名数组中拆分和选择?
EN

Stack Overflow用户
提问于 2015-04-23 12:59:33
回答 4查看 3.3K关注 0票数 0

我有一个脚本,我写在我的公司清理Citrix UPM配置文件。不太复杂,但它为运行在其上的每个用户生成日志。按照下列格式:

0733重置-e0155555-20150112-0733

1128重置-n9978524-20150114-1128

0840重置-jsmith-20150113-0840

等。

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

代码语言:javascript
运行
复制
$arrFiles = Get-Childitem "c:\logs"
$arrFiles | %{ $arrfile = $_ -split ('-'); Write-Host $arrfile[0]}

编辑:为了子孙后代,包括测试代码。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-23 13:17:33

我会尝试这样的方法:

代码语言:javascript
运行
复制
$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.DirectoryInfoSystem.IO.FileInfo。这意味着如果我们使用$_,我们将引用整个对象。更糟糕的是,这两个对象都没有Split()方法,所以$_.Split('-')会引用一个不存在的函数。

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

在命令行中尝试这样的操作:

代码语言:javascript
运行
复制
$x = Get-ChildItem 'N:\Folder\UPMreset-e0155555-20150112-0733.txt';
$x | Get-Member;

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

将上面的内容与此进行比较:

代码语言:javascript
运行
复制
$x.BaseName | Get-Member;

您可以看到它是一个字符串,有各种各样的方法,比如拆分、替换、IndexOf等等。

另一个有用的办法是:

代码语言:javascript
运行
复制
$x | Select-Object *;

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

这突出了学习如何处理对象的最佳方法之一。将其导入Get-Member,您将了解可以访问的类型和任何方法或属性。再加上将一些东西输送到Select-Object *,可以告诉您您正在使用的是什么。

票数 3
EN

Stack Overflow用户

发布于 2015-04-23 13:09:47

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

代码语言:javascript
运行
复制
$filenames = @(
'UPMreset-e0155555-20150112-0733',
'UPMreset-n9978524-20150114-1128',
'UPMreset-jsmith-20150113-0840'
)

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

e0155555
n9978524
jsmith
票数 3
EN

Stack Overflow用户

发布于 2015-04-23 13:04:46

看起来文件名总是UPMreset-,后面跟着用户名。所以请使用这个:

UPMreset-(.+?)-

捕获组将包含用户名。它使用一个懒惰的量词来得到任何东西,直到下一个破折号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29824188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档