如何解析gci名称?

分享于 

5分钟阅读

电脑

  繁體 雙語

问题:


# Microsoft Windows [Version 10.0.17134.648] 


# powershell 5.1.17134.48 


# dir directory. Include index*,avail* where the last write time is less than


# 4 days. Display a parsed Name. Display the Length and the LastWriteTime.



$time = (Get-Date).AddDays(-4)


gci * -include index*,avail* | where {$_.LastWriteTime -gt $time} | format-table -HideTableHeaders Name,Length,LastWriteTime



输出:


available13.html.2019-03-26_081523.bak 93130 3/26/2019 8 : 10 : 05 AM


index.html.2019-03-26_081538.bak 93134 3/26/2019 8 : 15 : 23 AM



我想将名称解析为:


available13.html 93130 3/26/2019 8 : 10 : 05 AM


index.html 93134 3/26/2019 8 : 15 : 23 AM



如果我使用:


$delim ="."


gci * -include *index*,*available13* -Name | `


foreach { 


 $nameArray = $_.Split($delim)


 $newName = $nameArray[0] +"." + $nameArray[1]


 Write-Output $newName


}



我得到解析名,没有日期限制,没有大小,没有最后的写入时间。


available13.html


available13.html


index.html


index.html



我尝试过:

  • gci | 通用| -paging
  • google搜索两天
  • 一个 正规表达式 ( 我目前还不精通)
  • 解析 gci outfile
  • 了,我得再来一次?


回答 1:

我将使用 正规表达式 和零长度追溯断言$_.Namehtml 删除所有内容

可以在 Select-Object 中或者在 Format-* 中使用计算属性完成这里操作


Get-ChildItem -File | 


 Format-Table @{n='foo';e={$_.Name -replace '(?<=^.*.html).*$'}},Name -HideTableHeaders



示例输出:


available13.html available13.html.2019-03-26_081523.bak


index.html index.html.2019-03-26_081538.bak




回答 2:

你可以使用 Add-Member 添加一个新属性,如下所示


$time = (Get-Date).AddDays(-4)


$files = gci * -include index*,avail* | where {$_.LastWriteTime -gt $time}


foreach ($f in $files) {


 $f | Add-Member noteproperty newName -Value `


 $f.Name.Substring(0, $f.Name.Length -".yyyy-mm-dd_iiiiii.bak".Length)


}


$files | Format-Table -HideTableHeaders newName,Length,LastWriteTime



注意 上面 Fragment假定你的名字总是以 .yyyy-mm-dd_iiiiii.bak 结尾。 如果它们有其他格式,那么你必须在问题中包含这些信息,并且你可能需要使用其他字符串方法,如 replace 。substring 。 删除不必要的部分


回答 3:


# Microsoft Windows [Version 10.0.17134.648] 


# powershell 5.1.17134.48


# parse Notepad++"backup on save" filenames.


# dir directory. Include index*,avail* where the last write time is less than


# 4 days. Display a parsed Name. Display the Length (size) and the LastWriteTime.


# Can be used as a shortcut: powershell -noexit $time = (Get-Date).AddDays(-4); gci * -include index*,avail* | where {$_.LastWriteTime -gt $time} | Format-Table @{n='foo';e={$_.Name -replace '(?<=^.*.html).*$'}},Length,LastWriteTime -HideTableHeaders


# Start it in your directory of choice.



$time = (Get-Date).AddDays(-4)


gci * -include index*,avail* | where {$_.LastWriteTime -gt $time} | Format-Table @{n='foo';e={$_.Name -replace '(?<=^.*.html).*$'}},Length,LastWriteTime -HideTableHeaders



预期结果:


available13.html 93130 3/26/2019 8 : 10 : 05 AM


index.html 39386 3/26/2019 8 : 10 : 05 AM



实际结果:


available13.html 93130 3/26/2019 8 : 10 : 05 AM


index.html 39386 3/26/2019 8 : 10 : 05 AM



有关解析的几乎解决方案,请参见LotPings答案: 我将使用 正规表达式 中的零长度跟踪断言来删除 $_.Name 之后的所有内容。 查看以下更正的解决方案。


| Format-Table @{n='foo';e={$_.Name -replace '(?<=^.*.html).*$'}},Length,LastWriteTime -HideTableHeaders





PAR  POW  parse  Powershell