我需要将此代码转换为PowerShell

时间:2017-12-08 18:37:22

标签: powershell

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

manu="$1"

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

我确实这样:

$car = Import-Csv -Header "Manufacturer" , "Model" , "Price" -delimiter ';' auto.dat
$car | % { $_.Price = [int]$_.Price }
$car | Sort-Object Price -Descending

但我可以找到有关如何做grep和head or cut的信息,我尝试了很少的东西而且它没有用。基本上我想要的是

.\car.ps1 Tesla

这段代码应该给我昂贵的特斯拉模型

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

Lamborghini;Aventador;700000
Lamborghini;Urus;200000
Tesla;ModelS;180000
Tesla;ModelX;140000
Ford;Mustang;300000
Ford;Focus;20000
Audi;A8;100000
Audi;R8;500000

2 个答案:

答案 0 :(得分:3)

您想查看Get-Help about_Functions_Advanced_ParametersGet-Help about_Functions_Advanced。您可以通过从中删除函数语句和外括号来使脚本像函数一样工作。

所以,你可以采取这个功能:

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

[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 -Manu Audi
.\Car.ps1 -M Tesla
.\Car.ps1 Ford

答案 1 :(得分:1)

PowerShell和bash(一般是Unix)在管道方面需要注意的主要区别是,在PowerShell中,您通常处理的是真实对象,而不是文本流。

因此,到目前为止,您所做的一切之处在于,您根本不需要 headcut命令。

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

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

如果您想在第一行中使用模型的名称,请使用:

$car[0].Model

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

所以相反,你似乎想要的是使用传递给脚本(制造商)的参数,然后找到制造商所拥有的最昂贵的模型。

有很多方法可以做到这一点,有很多方法可以解决这个问题,但我会使用管道功能和完整对象向您展示一种非常PowerShell的方式。

替换你的第三行,我做了类似的事情:

$car | 
    Where-Object { $_.Manufacturer -eq $args[0] } | 
    Sort-Object Price -Descending | 
    Select-Object -ExpandProperty Model -First 1

注意你可以在管道后换行,更容易阅读。

我在这里浏览行,过滤掉制造商匹配的行,然后按价格排序(降序),然后取第一个并保留Model属性。

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