Powershell 挑战

Powershell 挑战

一位朋友向我提出了以下挑战:

“找到按文件名的最后一个字符对目录列表进行排序的最快捷、最简单的方法。”

他在 Linux 上使用以下命令完成了此操作:

ls | rev | sort | rev 

我想向他展示 powershell 替代方案,但我才刚刚开始学习 powershell,我做不到。所以,我偷懒了,请求你的帮助。

答案1

不幸的是,Powershell 没有一个很好的简单反向方法,所以你必须获取字符串的最后一个字母并按此排序。这是我做过的一种方法:

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

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

答案2

您可以尝试以下操作:

dir| sort {$_.name[-1]}

答案3

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

不像 unix 版本那么短,主要是因为 .NET Framework 中没有 String.Reverse() 函数。基本上,它通过告诉 sort“通过计算输入参数上的这个表达式进行排序”来实现。


现在,如果有任何 unix shell 比

dir | sort -Property Length -Descending

首先打印所有文件,其中最大的一个,我很有兴趣看看。

答案4

谢伊的变体通过索引字符串,比可接受的答案短得多,但即使这样也可以改进。您可以通过排除不必要的空格并使用更短的别名来进一步缩短它:

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

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

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

它将直接返回字符串。

如果你真的想按撤销字符串,则以下工作有效(但很慢):

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

如果文件名的长度有上限,则可以加快速度。

相关内容