2013-10-14 306 views
0

我有一个目录,其子目录都为数字:转换字符串列表为数字

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

回答

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 
+0

您的意思是使用'$ lessThanNumber'而不是3000? –

+0

是的,这是我理解你的问题的方式。 – JPBlanc

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最后)

1

如果你有V3:

@(Get-ChildItem -Path $Path -Directory -Name | 
ForEach-Object {$_ -as [int]}) -lt $LessThanNumber | 
sort | select -last 1 
1

使用PowerShell v3的:

Get-ChildItem $path -dir | Select *,@{n='Number';e={[int]$_.Name}} | 
    Where Number -lt $lessThanNumber | Sort Number | Select -Last 1 
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