我正在所有文件夹中搜索文件。
Copyforbuild.bat
可在许多地方使用,我想进行递归搜索。
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
如何在PowerShell中执行此操作?
我正在所有文件夹中搜索文件。
Copyforbuild.bat
可在许多地方使用,我想进行递归搜索。
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
如何在PowerShell中执行此操作?
Answers:
将Get-ChildItem cmdlet与-Recurse
开关一起使用:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
其次ls -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
在文件名的末尾添加星号()来使此答案适合部分字符串。****** LINE1:$File = "Microsoft.OData.Core.NetFX35.V7*"
LINE2:$Folder = "C:\Program Files"
LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
我用它来查找文件,然后让PowerShell显示结果的完整路径:
dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
您始终可以*
在FolderName
和/或中使用通配符FileName.fileExtension
。例如:
dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
上面的示例将搜索C:\
驱动器中以单词开头的任何文件夹Folder
。因此,如果您有一个名为的文件夹FolderFoo
,FolderBar
PowerShell将显示这两个文件夹的结果。
文件名和文件扩展名也是如此。如果要搜索具有特定扩展名的文件,但不知道文件名,则可以使用:
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
或相反亦然:
dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
这是我在奋斗之后终于想出的方法:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
要使输出更整洁(仅路径),请使用:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
要仅获得第一个结果,请使用:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
现在了解重要内容:
仅搜索文件/目录,请不要使用-File
或-Directory
(请参阅下面的原因)。而是将其用于文件:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
并删除-eq $false
for目录。千万不能让像一个尾随通配符bin/*
。
为什么不使用内置开关?它们很糟糕,会随机删除功能。例如,为了-Include
与文件一起使用,必须以通配符结尾路径。但是,这将禁用该-Recurse
开关,而不会告诉您:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
您可能认为这会给您所有*.lib
子目录中的全部,但只会搜索的顶级bin
。
为了搜索目录,可以使用-Directory
,但是随后必须删除尾随的通配符。无论出于何种原因,这都不会停用-Recurse
。出于这些原因,我建议不要使用内置标志。
您可以大大缩短此命令:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
变成
gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Get-ChildItem
别名为 gci
-Path
默认位置为0,因此您可以设置第一个参数路径-Recurse
别名为 -s
-Include
没有速记试试这个:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
排除文件夹