当文件中只有一行时,Powershell对文件中的行计数不正确?

当文件中只有一行时,Powershell对文件中的行计数不正确?,powershell,count,Powershell,Count,我正在编写一个powershell脚本来计算包含100000多行的csv文件的摘要统计信息 在我的foreach循环中,我的一行是: $count = $Not_10000.count 其中“$Not_10000”是过滤csv后的结果,该csv是使用导入csv命令读取并使用 where {$_.ifhighspeed -eq 10000}. 我发现只要“$Not_10000”有多行,“$count”的值就是正确的。但是,当“$Not_10000”只有一行时,结果是$count为空。我尝试进入

我正在编写一个powershell脚本来计算包含100000多行的csv文件的摘要统计信息

在我的foreach循环中,我的一行是:

$count = $Not_10000.count
其中“$Not_10000”是过滤csv后的结果,该csv是使用导入csv命令读取并使用

where {$_.ifhighspeed -eq 10000}.
我发现只要“$Not_10000”有多行,“$count”的值就是正确的。但是,当“$Not_10000”只有一行时,结果是$count为空。我尝试进入powershell提示符并执行以下操作

$count = $Not_10000 | Measure-Object -lines
但它显示0行,即使只有一行。产量

$Not_10000[0]

为什么这一行输出不能正确计数?我手动更改了过滤器,使“$Not_10000”包含15行,这是正确的计数


我似乎很难给出完整的图片,因此如果您需要更多信息或说明,请告诉我。

使用
测量对象的Count属性。线条、文字、字符是用来测量文本的东西,而不是对象

$count = $Not_10000 | Measure-Object | Select-Object -ExpandProperty Count

更多解释

我有一个带有标题和7个条目的csv

Path                                    Data                                    Files
----                                    ----                                    -----
\\someserver\somepath1                  100                                     1
\\someserver\somepath2                  150                                     4
\\someserver\somepath1                  200                                     5
\\someserver\somepath3                  450                                     8
\\someserver\somepath4                  200                                     23
\\someserver\somepath1                  350                                     2
\\someserver\somepath2                  800                                     9
执行以下操作时(
-行
不是
测量对象
的有效开关)

因为这不是文本,所以没有要测量的线。无论文件或过滤对象中有多少条目,我都会获得此输出。你会期望得到3,但实际上得到了0

Lines Words                         Characters                    Property
----- -----                         ----------                    --------
    0
如果我把文件读成文本,我会得到行的结果

Get-Content E:\temp\stack.csv | Measure-Object -line

 Lines
 -----
     8

使用
测量对象的计数属性
。线条、文字、字符是用来测量文本的东西,而不是对象

$count = $Not_10000 | Measure-Object | Select-Object -ExpandProperty Count

更多解释

我有一个带有标题和7个条目的csv

Path                                    Data                                    Files
----                                    ----                                    -----
\\someserver\somepath1                  100                                     1
\\someserver\somepath2                  150                                     4
\\someserver\somepath1                  200                                     5
\\someserver\somepath3                  450                                     8
\\someserver\somepath4                  200                                     23
\\someserver\somepath1                  350                                     2
\\someserver\somepath2                  800                                     9
执行以下操作时(
-行
不是
测量对象
的有效开关)

因为这不是文本,所以没有要测量的线。无论文件或过滤对象中有多少条目,我都会获得此输出。你会期望得到3,但实际上得到了0

Lines Words                         Characters                    Property
----- -----                         ----------                    --------
    0
如果我把文件读成文本,我会得到行的结果

Get-Content E:\temp\stack.csv | Measure-Object -line

 Lines
 -----
     8

马特给出了一个很好的答案,但这只是对你们问题的一种回答

.Count
属性是当结果数超过一个时引用的数组对象类型的成员。当您只有一个结果时,返回的不是数组、字符串、对象、整数或其他内容,而是数组,除非您专门将其设置为数组。为了使其始终返回一个数字:

$count = $Not_10000.count
您需要将其强制转换为数组,最简单的方法是将其封装在
@()

在数组上使用时,使用任何对象的.PSObject成员最容易看到这一点。让我们创建一个数组,查看类型以验证它是否为数组,然后查看该数组对象的PSObject成员(仅筛选属性,因为它有许多我们不关心的成员)

PS C:\Users> $test = @("Red","Blue","Green")

PS C:\Users> $test.GetType()

IsPublic IsSerial Name                                     BaseType                                 
-------- -------- ----                                     --------                                 
True     True     Object[]                                 System.Array                             

PS C:\Users> $test.PSObject.Members | Where{$_.MemberType -match "property"}|FT Name,MemberType,Value,ReferencedMemberName

Name                                    MemberType                    Value ReferencedMemberName    
----                                    ----------                    ----- --------------------    
Count                                AliasProperty                        3 Length                  
Length                                    Property                        3                         
LongLength                                Property                        3                         
Rank                                      Property                        1                         
SyncRoot                                  Property       {Red, Blue, Green}                         
IsReadOnly                                Property                    False                         
IsFixedSize                               Property                     True                         
IsSynchronized                            Property                    False                         
Item                         ParameterizedProperty ...int index) {get;set;} 

我们在这里看到的是,它是成员长度的alias属性,数组中的alias属性提供记录数,就像它的alias Count一样。

Matt给出了一个很好的答案,但这只是对您的问题的一种回答

.Count
属性是当结果数超过一个时引用的数组对象类型的成员。当您只有一个结果时,返回的不是数组、字符串、对象、整数或其他内容,而是数组,除非您专门将其设置为数组。为了使其始终返回一个数字:

$count = $Not_10000.count
您需要将其强制转换为数组,最简单的方法是将其封装在
@()

在数组上使用时,使用任何对象的.PSObject成员最容易看到这一点。让我们创建一个数组,查看类型以验证它是否为数组,然后查看该数组对象的PSObject成员(仅筛选属性,因为它有许多我们不关心的成员)

PS C:\Users> $test = @("Red","Blue","Green")

PS C:\Users> $test.GetType()

IsPublic IsSerial Name                                     BaseType                                 
-------- -------- ----                                     --------                                 
True     True     Object[]                                 System.Array                             

PS C:\Users> $test.PSObject.Members | Where{$_.MemberType -match "property"}|FT Name,MemberType,Value,ReferencedMemberName

Name                                    MemberType                    Value ReferencedMemberName    
----                                    ----------                    ----- --------------------    
Count                                AliasProperty                        3 Length                  
Length                                    Property                        3                         
LongLength                                Property                        3                         
Rank                                      Property                        1                         
SyncRoot                                  Property       {Red, Blue, Green}                         
IsReadOnly                                Property                    False                         
IsFixedSize                               Property                     True                         
IsSynchronized                            Property                    False                         
Item                         ParameterizedProperty ...int index) {get;set;} 

我们在这里看到的是,它是成员长度的alias属性,数组上的alias属性提供记录数,就像它的alias Count一样。

虽然我可以复制它,但每当我在对象上使用
-line
时,我都会得到
0
<代码>-行
更多用于文本<代码>单独测量对象并捕获计数属性
$count=($Not_10000 |测量对象)。count
谢谢
($Not_10000 |测量对象)。Count
按我的需要工作。不确定为什么
$Not_1000。尽管count
不起作用。count是
度量对象的属性,而不是Csv对象。查看我的答案,如果它有助于标记它。虽然我可以复制此答案,但每当我在对象上使用
-line
时,我都会得到
0
<代码>-行
更多用于文本<代码>单独测量对象并捕获计数属性
$count=($Not_10000 |测量对象)。count
谢谢
($Not_10000 |测量对象)。Count
按我的需要工作。不确定为什么
$Not_1000。尽管count
不起作用。count是
度量对象的属性,而不是Csv对象。看看我的答案,如果它有助于标记它本身。+1很好地补充了我的答案。看起来我确实忽略了这个事实。+1很好地补充了我的答案。看起来我对那个事实漠不关心。