Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell按特定字符对字符串数组进行排序_Powershell_Sorting - Fatal编程技术网

Powershell按特定字符对字符串数组进行排序

Powershell按特定字符对字符串数组进行排序,powershell,sorting,Powershell,Sorting,我正在使用powershell脚本,该脚本自动执行一些长时间运行的部署任务 我正在使用 $scripts = Get-ChildItem -r -Path server-deploy | select -expand fullname 获取如下所示的数组 D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-10.ps1 D:\BitBucket\CI\serverdeploy\builder\server-dep

我正在使用powershell脚本,该脚本自动执行一些长时间运行的部署任务

我正在使用

$scripts = Get-ChildItem -r -Path server-deploy | select -expand fullname
获取如下所示的数组

D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-10.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-20.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-30.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-40.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-50.ps1
我在那里留下了一些“漏洞”,以便在需求发生变化时添加额外的脚本。脚本将始终命名为“install-someword-int.ps1”,顺序由int决定

我知道Get-ChildItem已经按照正确的顺序对它们进行了排序,但我希望能够创建一个函数,该函数可以始终对它们进行排序,因此如果需要添加脚本,例如install-builder-15.ps1,我知道它将在10之后和20之前运行。作为一个好的保管人,我不相信Get ChildItem总是按照正确的顺序归还它们

我正在寻找对$scripts进行排序的正确方法,或者使用某种for循环来迭代数组,但总是按照正确的顺序

编辑:@boxdog 使用以下文件:

install-builder-10.ps1                                                                                                                 
install-builder-20.ps1                                                                                                                 
install-builder-30.ps1                                                                                                                 
install-builder-4.ps1                                                                                                                  
install-builder-5.ps1 
如果我运行
Sort Object@{e={$\匹配“*install-.*-(?\d+).ps1”;$matches.number}
我看到它们的顺序是一样的。我希望

install-builder-4.ps1                                                                                                                  
install-builder-5.ps1 
install-builder-10.ps1                                                                                                                 
install-builder-20.ps1                                                                                                                 
install-builder-30.ps1     

如果您感兴趣的只是按字符串末尾的int进行排序,则可以使用
排序对象
对它们进行排序,如下所示:

$paths = "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-30.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-sortofbuilder-20.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-10.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-20.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-50.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-notbuilder-10.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-15.ps1"

$paths | Sort-Object @{e={$_ -match ".*install-.*-(?<number>\d+).ps1" | Out-Null; [int]$matches.number}}

如果您感兴趣的只是按字符串末尾的int进行排序,则可以使用
排序对象
对它们进行排序,如下所示:

$paths = "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-30.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-sortofbuilder-20.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-10.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-20.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-50.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-notbuilder-10.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-15.ps1"

$paths | Sort-Object @{e={$_ -match ".*install-.*-(?<number>\d+).ps1" | Out-Null; [int]$matches.number}}

这里是“按计算值排序”思想的另一个变体。这将在排序之前将结束数字强制转换为
[int]
。[咧嘴笑]

输出

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
darhsl       1600-12-31   6:00 PM                install-builder-4.ps1
darhsl       1600-12-31   6:00 PM                install-builder-5.ps1
darhsl       1600-12-31   6:00 PM                install-builder-10.ps1
darhsl       1600-12-31   6:00 PM                install-builder-20.ps1
darhsl       1600-12-31   6:00 PM                install-builder-30.ps1

这里是“按计算值排序”思想的另一个变体。这将在排序之前将结束数字强制转换为
[int]
。[咧嘴笑]

输出

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
darhsl       1600-12-31   6:00 PM                install-builder-4.ps1
darhsl       1600-12-31   6:00 PM                install-builder-5.ps1
darhsl       1600-12-31   6:00 PM                install-builder-10.ps1
darhsl       1600-12-31   6:00 PM                install-builder-20.ps1
darhsl       1600-12-31   6:00 PM                install-builder-30.ps1

好啊所以它的排序类似于install-builder-10.ps1 install-builder-20.ps1 install-builder-30.ps1install-builder-4.ps1 install-builder-5.ps1使用
$path | Sort Object@{e={$\匹配,将数字用零填充到唯一长度“*install-.*-(?\d+).ps1”;$matches.number.padlefit(20,'0')}
Oops!发布前没有足够的测试。我已经更正了我的示例,现在应该可以正常工作了。
sort{[int]($.-replace'.*(\d+\.ps1$,'$1')”
?@CarComp不想把这变成政治话题,但如果从英国脱欧中有什么教训的话,那就是当有更好的信息出现时,你应该始终可以选择改变你的投票。请随意取消选择我的答案;我不会感到不安……老实说,好吧,所以它的排序类似于install-builder-10.ps1install-builder-20.ps1 install-builder-30.ps1install-builder-4.ps1 install-builder-5.ps1使用
$path | Sort Object@{e={$|-match'.*install-.*-(?\d+.ps1);$matches.number.PadLeft(20,'0')}将数字左移到唯一长度
Oops!在发布之前没有进行足够的测试。我已经更正了我的示例,现在应该可以正常工作了。
sort{[int]($\u-replace'.*(\d+)\.ps1$,'$1')}
?@CarComp不想把这变成政治问题,但如果从英国脱欧中有什么教训的话,那就是当有更好的信息出现时,你应该始终可以选择改变你的投票。请随意取消选择我的答案;我不会感到不安……老实说,你已经击败了我!(+1)@西奥-我开始尝试用正确的数字零填充来重命名文件。然后我放弃了,选择了更简单的方法…[咧嘴笑]另一个很好的解决方案。我希望我能选择两者作为答案。这更干净。@CarComp-谢谢!我喜欢摆弄它…一个有趣的问题。[咧嘴笑]你刚刚打败了我!(+1)@西奥-我开始尝试用正确的数字零填充来重命名文件。然后我放弃了,选择了更简单的方法…[咧嘴笑]另一个很好的解决方案。我希望我可以选择两者作为答案。这更干净。@CarComp-谢谢!我喜欢摆弄它…这是一个很有趣的问题。[咧嘴笑]