![](/img/trans.png)
[英]How can I get a list of filenames from a folder, and split the names at a specific spot?
[英]How can I split and select from an array of filenames in 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]}
編輯:為后代提供的測試代碼。
.split('-')[1]
您遇到什么問題?
$filenames = @(
'UPMreset-e0155555-20150112-0733',
'UPMreset-n9978524-20150114-1128',
'UPMreset-jsmith-20150113-0840'
)
$filenames |% {$_.split('-')[1]}
e0155555
n9978524
jsmith
我會嘗試這樣的事情:
$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.DirectoryInfo
或System.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;
您將獲得對象可以執行的方法(函數)和對象的屬性(屬性值)的巨大列表。 名稱,全名,基本名和擴展名都是非常常用的屬性。 您還應該看到NoteProperties和CodeProperties,它們由PowerShell提供程序添加,使使用它們更加容易(它們在C#程序中不可用)。 該定義告訴您如何調用該方法或屬性的類型以及可以使用該方法做什么。 您通常可以在Google上找到有關如何使用它們的MSDN文檔,盡管這並非總是最簡單的方法。
比較以上內容:
$x.BaseName | Get-Member;
您會看到它是一個字符串,有各種各樣的方法,例如Split,Replace,IndexOf等。
另一個有用的是:
$x | Select-Object *;
這將返回該對象具有的所有Propety,NoteProperty和CodeProperty值。
這突顯了了解對象可以做什么的最佳方法之一。 用管道將其傳遞到Get-Member
,您將學習類型以及可以訪問的任何方法或屬性。 結合使用管道將某些內容傳遞給Select-Object *
,可以告訴您很多有關您正在使用的內容的信息。
看起來文件名始終是UPMreset-
,后跟用戶名。 所以使用這個:
UPMreset-(.+?)-
捕獲組將包含用戶名。 它使用惰性的量詞來獲取下一個破折號。
您也可以使用Group-Object在計算的屬性中進行拆分:
$FileNames = Get-ChildItem -Path $LogDir -Filter "*.txt" -Name
$FileNames | Group-Object @{Expression={($_ -split "-")[1]}} | Where-Object {$_.Count -gt 1}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.