我有一段代码旨在将以下内容发送到linux命令行:
wc -l C:/inputdirectory/P*
但是,我需要在 Windows 中运行此脚本,并尝试查找等效的命令。我试过了
find/c/v C:/inputdirectory/P*
但这会引发一个错误,即/v 不是有效的命令。你能告诉我为什么这不起作用吗?
*注意,命令本身没有说"输入目录",它有正确的目录,只是太乏味和私密而无法输入
由Eryk Sun提供:
尝试搜索""
,即空字符串;仅使用反斜杠作为路径分隔符;如果路径中有空格,则用引号括起来:
find /c /v "" "C:inputdirectoryP*"
注意:如果您只需要单个输入文件的行数,那么一个简单的解决方案(将整个文件加载到内存中(是,例如,(gc file.txt).Count
(gc
是Get-Content
的内置别名(.
更快的版本:(gc -ReadCount 0 file.txt).Count
从cmd.exe
(命令提示符/批处理文件(,这是过时的:
- 使用接受的答案。
在PowerShell中,你有两个选项:
- 选项 A(次优(:也使用可接受的答案,稍作调整:
find --% /c /v "" "C:inputdirectoryP*"
注意:停止解析符号--%
告诉PowerShell将后续参数按原样传递给目标程序(在扩展cmd
样式的环境变量引用(如%USERNAME%
,如果有的话(之后(。
在手头的情况下,这可以防止PowerShell解析""
,并且错误地忽略将其传递到外部目标程序(find.exe
(。
有关 PowerShell 在调用外部程序时处理引号时存在很大问题的摘要,请参阅此答案。
上述find.exe
命令的输出 - 实际上,任何外部程序,都只是文本,在这种情况下,它看起来像这样:
---------- PFILE1.TXT: 42
---------- PFILE2.TXT: 666
...
虽然此输出对于人类观察者来说很容易掌握,但它会使后续的编程处理变得繁琐,因为需要文本解析。
如下所述,使用 PowerShell 本机命令 (cmdlet( 可提供更大的灵活性,因为 PowerShell 命令通常会发出具有类型化属性的对象,这极大地方便了后续处理。
- 选项 B(首选(:将 PowerShell 自己的
Measure-Object
cmdlet 与-Line
开关配合使用:
注意:虽然此命令比find
解决方案更详细,但由于输出具有类型化属性的对象,它最终提供了更大的灵活性,这极大地方便了后续处理;此外,PowerShell 复杂的输出格式系统提供了用户友好的默认表示形式。
Get-Item -Path "C:inputdirectoryP*" -PipelineVariable file | ForEach-Object {
Get-Content -LiteralPath $file |
Measure-Object -Line |
Select-Object @{ Name='File'; Expression={ $file } }, Lines
}
上面的输出对象分别具有.File
和.Lines
属性,默认情况下,PowerShell 将按如下所示打印这些对象:
File Lines
---- -----
C:inputdirectoryPfile1.txt 42
C:inputdirectoryPfile2.txt 666
...
除了更好的输出呈现之外,输出的面向对象性质还使以编程方式处理结果变得容易。
例如,如果要将输出限制为行数为100
或更大的文件,请通过管道传输到以下Where-Object
调用上述命令:
... | Where-Object Lines -ge 100
如果(另外(想要先按最高行数排序,请通过管道传输到Sort-Object
cmdlet:
... | Sort-Object -Descending Lines
如何计算一组文件中的行数?
使用以下批处理文件 (CountLines.cmd(:
@echo off
Setlocal EnableDelayedExpansion
for /f "usebackq" %%a in (`dir /b %1`) do (
for /f "usebackq" %%b in (`type %%a ^| find "" /v /c`) do (
set /a lines += %%b
)
)
echo %lines%
endlocal
用法:
CountLines C:/inputdirectory/P*
延伸阅读
- Windows CMD 命令行的 A-Z 索引 - 与 Windows cmd 行相关的所有内容的绝佳参考。
- dir - 显示文件和子文件夹的列表。
- find - 在文件中搜索文本字符串并显示找到它的所有行。
- for/f - 针对另一个命令的结果循环命令。