Powershell的挑战

我受到一位朋友的挑战,做了以下工作:

“find用文件名的最后一个字符对目录列表进行sorting的最快最简单的方法。”

他使用以下方法在Linux上完成:

ls | rev | sort | rev 

我想向他展示powershell的select,但我只是刚刚开始学习powershell,我不能这样做。 所以,我在欺骗,并寻求你的帮助。

不幸的是,Powershell没有一个很好的简单的反向方法,所以你必须得到string的最后一个字母,然后sorting。 这是我做过的一个方法:

 dir| sort {$_.name.Substring($_.name.length-1)} 

正如已经指出的那样,这只会严格按照最后一个字母sorting,而我的Linux版本将按照最后一个字母和后续字母sorting,因此可能有更好的方法来做到这一点,或者你可能需要引入一些循环如果你想这样。

DIR | sorting{$ _。name [-1]}

 dir | sort -Property @{Expression ={$n = $_.Name.ToCharArray(); [Array]::Reverse($n);[String]::Join("",$n)}} 

不像Unix版本那么简单,主要是因为.NET Framework中没有String.Reverse()函数。 基本上这是通过告诉sorting“通过在input参数上计算这个expression式来sorting”来工作的。


现在,如果任何Unix的shell比

 dir | sort -Property Length -Descending 

打印所有最大的文件,我有兴趣看到它。

我相信有人可以做得更好,但是这里有一个与lynix完全兼容的方法。 它的好处是为您的工具箱留下一个可重复使用的revstring函数,即它将整个stringsorting,而不仅仅是最后一个字符:

 function rev ($s) {return -join ($s[$s.Length..0])} dir | foreach{rev($_.name)} | sort | foreach{rev($_)} 

我认为foreach在这里很好地演示了PowerShellpipe道是如何在数组中而不是在* nix中的简单string。

我花了一点时间才意识到,我不得不在第二个foreach使用$_而不是$_.name foreach 。 所以我从一个pipe道到另一个pipe道学习了一些关于数组内容的变化。

*信用我的revfunction的内容去http://rosettacode.org/wiki/Reverse_a_string#PowerShell


像lynix一样工作:

  • dir | sorting-Property @ {Expression = {$ n = $ _。Name.ToCharArray(); [arrays] ::逆向($ n)的; [string] ::join( “”,$ N)}}

像lynix一样的工作,但非常非常慢:

  • ls -n | sort {$ _ [3e3..0]}

不要像lynix那样工作,即不能sorting文件名的所有字符; (只sortingstring的最后一个字符):

  • DIR | sort {$ .name.Substring($ .name.length-1)}
  • DIR | sorting{$ _。name [-1]}
  • LS |sorting{$ _名称[-1]}
  • LS |sorting{ “$ _”[ – 1]}
  • ls -n | sort {$ _ [ – 1]}

Shay的变体比通过索引string而被接受的答案要短,但即使这样也可以改进。 您可以通过排除不必要的空格和使用较短的别名来缩短它:

 ls|sort{$_.Name[-1]} 

您也可以使用(缩写) -Name参数来Get-ChildItem

 ls -n|sort{$_[-1]} 

这将直接返回string。

如果你真的想按反向string进行sorting,那么下面的工作(但是很慢):

 ls -n|sort{$_[3e3..0]} 

如果文件名的长度有一个上限,则可以使其更快。

 ls|sort{"$_"[-1]}