在 Powershell 中,如何(递归地)列出目录中包含与给定正则表达式匹配的文本的所有文件?有问题的文件包含很长的难以理解的文本行,所以我不想看到匹配的行 - 只想看到文件名。
答案1
您可以使用Select-String
在文件中搜索文本,并Select-Object
返回每个匹配项的特定属性。如下所示:
Get-ChildItem -Recurse *.* | Select-String -Pattern "foobar" | Select-Object -Unique Path
或者使用别名的更短版本:
dir -recurse *.* | sls -pattern "foobar" | select -unique path
如果您只想要文件名而不是完整路径,请替换Path
为Filename
。
解释:
Get-ChildItem
-Recurse *.*
返回当前目录及其所有子目录中的所有文件。Select-String
-Pattern "foobar"
在这些文件中搜索给定的模式“foobar”。Select-Object
-Unique Path
仅返回每个匹配的文件路径;该-Unique
参数消除了重复项。
答案2
请注意,在 powershell v1.0 和 v2.0 中,您需要指定要使用的第一个位置参数(路径)-Recursion
递归
获取指定位置中的项目以及该位置的所有子项目。
在 Windows PowerShell 2.0 及更早版本的 Windows PowerShell 中,Recurse 参数仅当 Path 参数的值是具有子项的容器(如 C:\Windows 或 C:\Windows*)时才有效,而当它是没有子项的项(如 C:\Windows*.exe)时则无效。
答案3
在您想要执行“grep”的目录中使用以下命令,并进行更改[SEARCH_PATTERN]
以匹配您想要匹配的内容。它是递归的,搜索目录中的所有文件。
dir -Recurse | Select-String - pattern [SEARCH_PATTERN]
答案4
选择字符串有一个-List
用于此目的的参数:
仅返回每个输入文件中的第一个匹配项。默认情况下,Select-String 会为找到的每个匹配项返回一个 MatchInfo 对象。
你可以像这样使用它:
gci -Recurse | sls -List FOOBAR
以下是一些示例结果(在 Windows SDK 中搜索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)
如果您想要取回实际的FileInfo
对象(而不是相对路径和单个匹配结果),您可以像这样使用它:
Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }