[英]What is the windows equivalent of Linux command wc -l?
我有一段代碼旨在將以下內容發送到linux命令行:
wc -l C:/ inputdirectory / P *
但是,我需要在Windows中運行此腳本,並試圖找到等效的命令。 我努力了
查找/ c / v C:/ inputdirectory / P *
但這會引發錯誤,表明/ v不是有效命令。 您能告訴我為什么這不起作用嗎?
*請注意,該命令本身未顯示“ inputdirectory”,它具有正確的目錄,太繁瑣且私有,無法鍵入
使用以下批處理文件(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*
從cmd.exe
(命令提示符/ 批處理文件 )中,已過時 :
在PowerShell中 ,您有兩個選擇 :
find --% /c /v "" "C:\inputdirectory\P*"
注意: --%
(停止分析符號)告訴PowerShell將后續參數按原樣傳遞給目標程序(在擴展cmd
樣式的環境變量引用(例如%USERNAME%
,如果有)之后)。
在當前情況下,這會阻止PowerShell分析""
並且-會錯誤地 - 忽略將其傳遞給外部目標程序( find.exe
)。
有關PowerShell在調用外部程序時對引號的處理有很大問題的摘要,請參見以下答案 。
上面的find.exe
命令的輸出-以及實際上任何外部程序的輸出都是text ,在這種情況下,它看起來像這樣:
---------- PFILE1.TXT: 42
---------- PFILE2.TXT: 666
...
盡管此輸出對於人類觀察者來說很容易掌握,但由於需要文本解析,因此使后續的程序處理變得麻煩 。
如下所述,使用PowerShell本機命令(cmdlet)提供了更大的靈活性,因為PowerShell命令通常會發出帶有類型化屬性的 對象 ,這極大地方便了后續處理。
Measure-Object
cmdlet與-Line
開關一起使用: 注意:雖然此命令比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
cmdlet:
... | Sort-Object -Descending Lines
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.