Powershell中的条件逻辑和强制转换

时间:2014-06-03 15:28:20

标签: powershell scripting

我创建了一个导入2列CSV数据的脚本,按一个类型对int进行排序,并且只显示0到10,000之间的值。我已经能够进入排序部分了,我只能显示大于0.当我尝试添加" -and -lt 10000"各种方式,我无法获得任何有用的数据。不过,有一次尝试给了我数据,好像它又是字符串一样。

这只给了我> 0但排序为int类型。中途!:

PS C:\> $_ = Import-Csv .\vc2.csv | Select -Property User_Name, Minutes; $_ | Sort {[int] $_.Minutes} | Where {($_.Minutes -gt 0)}

这给了我10000> x> 0但排序为字符串:

PS C:\> $_ = Import-Csv .\vc.csv | Select -Property User_Name, Minutes; $_ | Sort {[int] $_.Minutes} | Where {($_.Minutes -gt 0) -and ($_.Minutes -lt 10)}

这里和这里是我尝试重铸为int的地方,它给了我很多错误:

PS C:\> $_ = Import-Csv .\vc.csv | Select -Property User_Name, Minutes; $_ | Sort {[int] $_.Minutes} | Where {[int]{($_.Minutes -gt 0) -and ($_.Minutes -lt 10000)}}

PS C:\> $_ = Import-Csv .\vc.csv | Select -Property User_Name, Minutes; $_ | Sort {[int] $_.Minutes} | Where { ({[int]$_.Minutes} -gt 0) -and ({[int]$_.Minutes} -lt 10000) }

错误:无法转换"($ .Minutes -gt 0) - 和($ .Minutes -lt 10000)" type" System.Management.Automation.ScriptBlock"输入" System.Int32"。

这个的正确语法是什么?

3 个答案:

答案 0 :(得分:2)

PowerShell通常会将二元运算符的参数强制转换为 left 操作数的类型。这意味着在执行$_.Minutes -gt 1010转换为字符串,因为解析后的CSV中的字段始终是字符串。您可以切换操作数:10 -lt $_.Minutes或添加演员:[int]$_.Minutes -gt 10+$_.Minutes -gt 10

通常,在处理包含我想要使用的非字符串数据的CSV时,我倾向于只添加一个后处理步骤,例如:

Import-Csv ... | ForEach-Object {
  $_.Minutes = [int]$_.Minutes
  $_.Date = [datetime]$_.Date
  ...
}

之后数据处理得更好,没有过多的演员和转换。

答案 1 :(得分:1)

问题是在Where语句中使用{和}括号。这些被解释为脚本块。

Where { ({[int]$_.Minutes} -gt 0) -and ({[int]$_.Minutes} -lt 10000) }

尝试使用(和)或完全排除它们。

Where { (([int]$_.Minutes) -gt 0) -and (([int]$_.Minutes) -lt 10000) }

您为$ _分配值的方式也很奇怪。

答案 2 :(得分:0)

$ _表示管道中的当前值。

$list = @(1,2,3)
$list | foreach { $_ }
1
2
3

通过分配" $ _"一个值,一旦将其放入管道中,就会丢失该值。

尝试以下方法:     $ mycsv = import-csv。\ vc.csv; $ mycsv |选择......等等。