Trong Powershell, làm cách nào để liệt kê tất cả các tệp trong một thư mục (đệ quy) có chứa văn bản khớp với biểu thức chính quy? Các tệp trong câu hỏi chứa các dòng văn bản thực sự khó hiểu, vì vậy tôi không muốn xem dòng phù hợp - chỉ tên tệp.
Trong Powershell, làm cách nào để liệt kê tất cả các tệp trong một thư mục (đệ quy) có chứa văn bản khớp với biểu thức chính quy? Các tệp trong câu hỏi chứa các dòng văn bản thực sự khó hiểu, vì vậy tôi không muốn xem dòng phù hợp - chỉ tên tệp.
Câu trả lời:
Bạn có thể sử dụng Select-String
để tìm kiếm văn bản bên trong các tệp và Select-Object
để trả về các thuộc tính cụ thể cho từng trận đấu. Một cái gì đó như thế này:
Get-ChildItem -Recurse *.* | Select-String -Pattern "foobar" | Select-Object -Unique Path
Hoặc một phiên bản ngắn hơn, sử dụng bí danh:
dir -recurse *.* | sls -pattern "foobar" | select -unique path
Nếu bạn chỉ muốn tên tệp, không phải đường dẫn đầy đủ, thay thế Path
bằng Filename
.
Get-ChildItem
-Recurse *.*
trả về tất cả các tệp trong thư mục hiện tại và tất cả các thư mục con của nó.
Select-String
-Pattern "foobar"
tìm kiếm các tệp cho mẫu "foobar" đã cho.
Select-Object
-Unique Path
chỉ trả về đường dẫn tệp cho mỗi trận đấu; các -Unique
tham số loại bỏ các bản sao.
Lưu ý rằng trong powershell v1.0 và v2.0, bạn cần chỉ định tham số vị trí đầu tiên (đường dẫn) để làm việc với -Recursion
-Recurse
Nhận các mục trong các vị trí được chỉ định và trong tất cả các mục con của các vị trí.
Trong Windows PowerShell 2.0 và các phiên bản Windows PowerShell trước đó, tham số Recurse chỉ hoạt động khi giá trị của tham số Đường dẫn là một thùng chứa có các mục con, chẳng hạn như C: \ Windows hoặc C: \ Windows *, chứ không phải khi nó là một mục không có mục con, chẳng hạn như C: \ Windows * .exe.
Sử dụng lệnh dưới đây trong thư mục bạn muốn thực hiện "grep" và thay đổi [SEARCH_PATTERN]
để khớp với những gì bạn muốn khớp. Đó là đệ quy, tìm kiếm thông qua tất cả các tệp trong thư mục.
dir -Recurse | Select-String - pattern [SEARCH_PATTERN]
Chuỗi chọn có một -List
tham số cho mục đích này:
Chỉ trả lại kết quả khớp đầu tiên trong mỗi tệp đầu vào. Theo mặc định, Chuỗi chọn trả về một đối tượng MatchInfo cho mỗi kết quả khớp được tìm thấy.
- ss64.com
Bạn có thể sử dụng nó như thế này:
gci -Recurse | sls -List FOOBAR
Đây là một số kết quả mẫu trông như thế nào (tìm kiếm Windows SDK cho ERROR_SUCCESS
):
shared\bthdef.h:576:#define BTH_ERROR(_btStatus) ((_btStatus) != BTH_ERROR_SUCCESS)
shared\netioapi.h:2254: ERROR_SUCCESS on success. WIN32 error code on error.
shared\rpcnterr.h:34:#define RPC_S_OK ERROR_SUCCESS
shared\winerror.h:214:// MessageId: ERROR_SUCCESS
um\advpub.h:40:// ERROR_SUCCESS_REBOOT_REQUIRED Reboot required.
um\bluetoothapis.h:243:// ERROR_SUCCESS
um\ClusApi.h:571:_Success_(return == ERROR_SUCCESS)
um\dsparse.h:102:_Success_(return == ERROR_SUCCESS)
um\eapmethodpeerapis.h:228:// If the function succeeds, it returns ERROR_SUCCESS. Otherwise, it is
um\eappapis.h:56:// If the functions succeed, they return ERROR_SUCCESS. Otherwise, it is
um\MapiUnicodeHelp.h:583: if ((hkeyPolicy && RegQueryValueExW(hkeyPolicy, szName, 0, &dwType, (LPBYTE)
&dwLcid, &dwSize) == ERROR_SUCCESS && dwType == REG_DWORD) ||
um\Mddefw.h:127: routine will return ERROR_SUCCESS and the inherited data even if
um\Msi.h:1693:// Returns ERROR_SUCCESS if file is a package.
um\MsiQuery.h:192:// Returns ERROR_SUCCESS if successful, and the view handle is returned,
um\msports.h:46: ERROR_SUCCESS if the dialog was shown
um\ncryptprotect.h:164: ERROR_SUCCESS
um\NTMSAPI.h:1761:_Success_ (return == ERROR_SUCCESS)
um\oemupgex.h:108:// Returns: ERROR_SUCCESS in case of success, win32 error otherwise
um\PatchWiz.h:90:// ERROR_SUCCESS, plus ERROR_PCW_* that are listed in constants.h.
um\Pdh.h:415:_Success_(return == ERROR_SUCCESS)
Nếu bạn muốn lấy lại các FileInfo
đối tượng thực tế (thay vì Đường dẫn tương đối và một kết quả khớp duy nhất), bạn có thể sử dụng nó như thế này:
Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
select -Unique
... tuyệt, học được điều gì đó mới. Điều đó làm việc hoàn hảo, cảm ơn!