我正在创建一个脚本,该脚本导入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) }
错误:无法将类型“System.Management.Automation.ScriptBlock”的“($ .Minutes -gt 0)-和($ .Minutes -lt 10000)”值转换为“System.Int32”。

正确的语法是什么?

最佳答案

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

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

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

之后,数据将更易于处理,而无需进行过多的强制转换和转换。

关于powershell - Powershell中的条件逻辑和转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24019089/

10-15 03:27