我有一个目录,其子目录都是数字:
./2856
./2357
./10198
等等。
我正在尝试编写一个Powershell脚本,该脚本将返回小于X的最大子目录名称。
所以在这个例子中,对于输入3000,它应该返回2856。
然而,到目前为止,我所写的内容对我来说非常麻烦,而且我想知道如何缩短它:
Get-ChildItem "$path" `
| ?{ $_.PSIsContainer } `
| Select-Object @{Name="AsInt"; Expression={[int]$_.Name}} `
| Select-Object -expand AsInt `
| ?{$_ -lt [int]$lessThanNumber} `
| measure-object -max `
| Select-Object -expand Maximum
答案 0 :(得分:1)
您可以尝试:
Get-ChildItem "$path" | Where-Object {$_.PSIsContainer -and [int]$_.name -le 3000} `
| Sort-Object -Property @{exp={[int]$_.name}} `
| Select-Object -Last 1
你可以写下来:
Get-ChildItem "$path" | ? {$_.PSIsContainer -and [int]$_.name -le 3000} `
| Sort -Property @{exp={[int]$_.name}} `
| Select -Last 1
如果您想避免由于这些非整数的目录名而导致的错误:
Get-ChildItem "$path" | ? {$_.PSIsContainer -and ($_.name -as [int]) -le 3000} `
| Sort -Property @{exp={$_.name -as [int]}} `
| Select -Last 1
答案 1 :(得分:1)
我尝试使用PowerShell v3:
$max = 3000
$cur = 0
ls -d | %{
# Potential for issues if the directory name cannot be cast to [int]
$name = ([int]$_.Name)
if (($name -gt $cur) -and ($name -le $max)) {
$cur = $name
}
}
(最后$ cur = 2856)
答案 2 :(得分:1)
如果你有V3:
@(Get-ChildItem -Path $Path -Directory -Name |
ForEach-Object {$_ -as [int]}) -lt $LessThanNumber |
sort | select -last 1
答案 3 :(得分:1)
使用PowerShell v3:
Get-ChildItem $path -dir | Select *,@{n='Number';e={[int]$_.Name}} |
Where Number -lt $lessThanNumber | Sort Number | Select -Last 1
答案 4 :(得分:1)
又一个(v3)的例子。仅传递包含数字的目录名称,并使用Invoke-Expression
cmdlet将名称计算为数字(不需要显式强制转换)
$x = 3000
Get-ChildItem -Directory | Where-Object {
$_.Name -notmatch '\D' -and (Invoke-Expression $_.Name) -lt $x
} | Sort-Object | Select-Object -Last 1