将字符串列表转换为数字

时间:2013-10-14 18:55:01

标签: powershell

我有一个目录,其子目录都是数字:

./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

5 个答案:

答案 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