注意:如果您只需要单个输入文件的行数,一个简单的解决方案(将整个文件加载到内存中)是,例如,(gc file.txt).Count
(gc
是 Get-Content
的内置别名)。
更快的版本:(gc -ReadCount 0 file.txt).Count
从 cmd.exe
(命令提示符 / 批处理文件)中,这已经是过时的:
从 PowerShell,您有两个选项:
find --% /c /v "" "C:\inputdirectory\P*"
注意:
--%
,停止解析符号,告诉PowerShell将随后的参数按原样传递给目标程序(在扩展
cmd
风格的环境变量引用(如
%USERNAME%
)之后,如果有的话)。
在这种情况下,这可以防止PowerShell解析
""
和-
mistakenly-
疏忽地未通过到外部目标程序(
find.exe
)。
对于PowerShell在调用外部程序时处理引号的高度问题的摘要,请参见
this answer。
上述
find.exe
命令的输出-实际上,任何
外部程序的输出都是纯文本,本例中看起来像这样:
---------- PFILE1.TXT: 42
---------- PFILE2.TXT: 666
...
虽然这个输出对于人类观察者来说很容易理解,但是它会使随后的编程处理变得复杂,因为需要进行文本解析。
使用 PowerShell 本地命令(cmdlet),如下所述,提供了更多的灵活性,因为 PowerShell 命令通常发出带有类型属性的对象,这极大地方便了随后的处理。
注意:虽然这个命令比 find
解决方案更加详细,但它最终提供了更多的灵活性,因为它输出具有类型属性的对象,这极大地便于后续处理;此外,PowerShell 的复杂输出格式系统提供了用户友好的默认表示。
Get-Item -Path "C:\inputdirectory\P*" -PipelineVariable file | ForEach-Object {
Get-Content -LiteralPath $file |
Measure-Object -Line |
Select-Object @{ Name='File'; Expression={ $file } }, Lines
}
以上代码输出对象,每个对象都有一个.File
和.Lines
属性,默认情况下PowerShell会打印如下内容:
File Lines
---- -----
C:\inputdirectory\Pfile1.txt 42
C:\inputdirectory\Pfile2.txt 666
...
除了输出更好的呈现外,输出的面向对象的特性使得编程处理结果变得容易。
例如,如果您想将输出限制为行数大于等于100
的文件,则可以将其管道到以下Where-Object
调用命令:
... | Where-Object Lines -ge 100
如果您还想按最高行数排序,可以将其管道传输到Sort-Object
命令:
... | Sort-Object -Descending Lines
""
,即空字符串;仅使用 反斜杠 作为路径分隔符;如果路径中有空格,请将其引用起来:find /c /v "" "C:\inputdirectory\P*"
。 - Eryk Sun