首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要把这段代码转换成PowerShell

我需要把这段代码转换成PowerShell
EN

Stack Overflow用户
提问于 2017-12-08 18:37:21
回答 2查看 82关注 0票数 0

我用Linux编写了这个Linux Shell脚本,现在我想用PowerShell编写它

代码语言:javascript
复制
manu="$1"

sort -t';' -nrk3 auto1.dat | grep "$manu" | head -n1 | cut -d';' -f2

我的确是这样想的:

代码语言:javascript
复制
$car = Import-Csv -Header "Manufacturer" , "Model" , "Price" -delimiter ';' auto.dat
$car | % { $_.Price = [int]$_.Price }
$car | Sort-Object Price -Descending

但我可以找到有关如何做grep和头或削减的信息,我尝试了一些东西,但它没有工作。所以基本上我想要的是

代码语言:javascript
复制
.\car.ps1 Tesla

这段代码会给我提供昂贵的特斯拉型号。

auto.dat文件包含汽车、车型和价格:

兰博基尼;阿文塔多;700000兰博基尼;乌鲁斯;200000特斯拉;车型;180000特斯拉;ModelX;140000福特;野马;300000福特;福克斯;奥迪20000;A8;100000奥迪;R8;500000

EN

回答 2

Stack Overflow用户

发布于 2017-12-08 19:00:10

你想看看Get-Help about_Functions_Advanced_ParametersGet-Help about_Functions_Advanced。通过删除函数语句和外部大括号,可以使脚本像函数一样工作。

因此,您可以使用以下函数:

代码语言:javascript
复制
function car {
[CmdletBinding()]
Param (
    [Parameter(Mandatory=$true,Position=1)]
    [String]
    $Manufacturer
)

Import-Csv -Path auto.dat -Header "Manufacturer","Model","Price" -Delimiter ';' |
    Where-Object { $_.Manufacturer -match $Manufacturer } |
    Sort-Object -Property @{e={[int]$_.Price}} -Descending |
    Select-Object -First 1
}

并将其保存为.\Car.ps1

代码语言:javascript
复制
[CmdletBinding()]
Param (
    [Parameter(Mandatory=$true,Position=1)]
    [String]
    $Manufacturer
)

Import-Csv -Path auto.dat -Header "Manufacturer","Model","Price" -Delimiter ';' |
    Where-Object { $_.Manufacturer -match $Manufacturer } |
    Sort-Object -Property @{e={[int]$_.Price}} -Descending |
    Select-Object -First 1

称之为:

代码语言:javascript
复制
.\Car.ps1 -Manu Audi
.\Car.ps1 -M Tesla
.\Car.ps1 Ford
票数 3
EN

Stack Overflow用户

发布于 2017-12-08 19:00:52

当涉及管道时,您需要注意PowerShell和bash (通常是Unix)之间的主要区别是,在PowerShell中,您通常处理的是真实的对象,而不是文本流。

因此,到目前为止,您所做的工作的优点是您根本不需要headcut命令。

head命令,哪个(大概是?)跳过标题行,已经通过将标题指定为Import-Csv来处理。

Import-Csv的结果是一个对象数组(每行一个),CSV中的每个列都是行对象的单个属性,其名称与标题相同。

如果要在第一行中使用模型的名称,请使用以下命令:

代码语言:javascript
复制
$car[0].Model

最后一行按价格对所有行进行排序,但它只是将该信息发送出管道。

因此,似乎您想要的是使用传递到脚本(制造商)中的参数,然后找到制造商拥有的最昂贵的模型。

有很多方法可以做到这一点,也有很多方法来构建这个结构,但是我将向您展示一种非常PowerShell的方法,使用管道和完整对象的功能。

取代你的第三行,我会做这样的事情:

代码语言:javascript
复制
$car | 
    Where-Object { $_.Manufacturer -eq $args[0] } | 
    Sort-Object Price -Descending | 
    Select-Object -ExpandProperty Model -First 1

请注意,您可以在管道后断线,更容易阅读。

在这里,我将遍历行,筛选出制造商匹配的行,然后按价格进行排序(降序),然后取前1,只保留Model属性。

我建议使用正确的命名参数(as shown in Bacon Bits's answer),而不是使用$args

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47720328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档