我有一段代码旨在将以下内容发送到linux命令行:
wc -l C:/ inputdirectory / P *
但是,我需要在Windows中运行此脚本,并试图找到等效的命令。我尝试过
找到/ c / v C:/ inputdirectory / P *
但这会引发错误,表明/ v不是有效命令。你能告诉我为什么这不起作用吗?
*请注意,该命令本身未显示“ inputdirectory”,它具有正确的目录,太繁琐且私有,无法键入
答案 0 :(得分:1)
尝试搜索""
,即一个空字符串;仅使用反斜杠作为路径分隔符;并引用路径中是否有空格:find /c /v "" "C:\inputdirectory\P*"
-eryksun
答案 1 :(得分:1)
使用以下批处理文件(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*
答案 2 :(得分:0)
来自cmd.exe
(命令提示符/一个批处理文件),该文件已过时:
在 PowerShell 中,您有两个选项:
find --% /c /v "" "C:\inputdirectory\P*"
注意:停止解析符号--%
告诉PowerShell将后续参数按原样传递给目标程序(在扩展cmd
样式的环境变量引用(例如{{1 }}(如果有)。
在当前情况下,这将阻止PowerShell分析%USERNAME%
和-mistakenly-忽略将其通过传递到外部目标程序(""
)。
有关PowerShell在调用外部程序时对引号引起的严重问题的处理的摘要,请参见this answer。
上面find.exe
命令的输出-实际上,任何外部程序都是 text ,在这种情况下,它看起来像这样:
find.exe
尽管此输出对于人类观察者来说很容易 ,但由于需要进行文本解析,因此使得随后的编程性处理繁琐。 / p>
如下所述,使用PowerShell本机命令(cmdlet)可提供更大的灵活性,因为PowerShell命令通常会发出具有类型属性的对象,这极大地促进了后续处理
---------- PFILE1.TXT: 42
---------- PFILE2.TXT: 666
...
开关使用PowerShell自己的Measure-Object
cmdlet: 注意:尽管此命令比-Line
解决方案更详细,但由于通过输出 objects ,最终提供了更大的灵活性。类型化的属性,极大地方便了后续处理;此外,PowerShell复杂的输出格式系统还提供了用户友好的默认表示形式。
find
上述输出的对象分别具有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
属性,PowerShell默认将其输出如下:
.Lines
除了输出的更好的表示之外,输出的面向对象性质还使得可以轻松地以编程方式处理结果。
例如,如果您希望将输出限制为行数为File Lines
---- -----
C:\inputdirectory\Pfile1.txt 42
C:\inputdirectory\Pfile2.txt 666
...
或更高的文件,则通过管道将其传递到以下对上述命令的Where-Object
调用:
100
如果(另外)您想首先按最高行数进行排序,请通过管道传递到Sort-Object
cmdlet:
... | Where-Object Lines -ge 100