2013-10-14 304 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