我想扫描整个桌面以查找 .bat,然后查看 .bat 文件的内容,并删除该文件(如果其中包含ipconfig一个项目。有什么办法可以做吗?我想不是使用第三方工具
答案1
下面的 Powershell 脚本获取文件的内容myfile.bat
,检查字符串是否ipconfig
存在。如果是,则删除该文件。
$file = 'c:\temp\myfile.bat`
$a = Get-Content $file | Select-String ipconfig
if( $a.Length -gt 0){Remove-Item $file}
要包含文件夹(例如您的桌面),请按如下所示更改脚本。替换mthecodeexpert
为您的真实用户名。
$folder = 'c:\users\thecodeexpert\*.bat'
$files = Get-ChildItem $folder -file
$files | ForEach-Object{ $a = Select-String -Path $_.Fullname ipconfig; if ($a.Length -gt 0){Remove-Item $_.Fullname}}
答案2
继续我的评论...
# Find the files by type
(Get-ChildItem -Path "$env:USERPROFILE\Desktop" -Filter '*.bat' -Recurse).FullName
# Results
<#
C:\Users\WDAGUtilityAccount\Desktop\SomeBatFile.bat
#>
# Test planned action on the file to find the string pattern
(Get-ChildItem -Path "$env:USERPROFILE\Desktop" -Filter '*.bat' -Recurse).FullName |
ForEach-Object {
If (Select-String -Path $PSItem -Pattern 'ipconfig')
{Remove-Item -Path $PSItem -WhatIf}
}
# Results
<#
What if: Performing the operation "Remove File" on target "C:\Users\WDAGUtilityAccount\Desktop\SomeBatFile.bat".
#>
# Take action on the file to find the string pattern
(Get-ChildItem -Path "$env:USERPROFILE\Desktop" -Filter '*.bat' -Recurse).FullName |
ForEach-Object {
If (Select-String -Path $PSItem -Pattern 'ipconfig')
{Remove-Item -Path $PSItem -Force -Verbose}
}
# Results
<#
VERBOSE: Performing the operation "Remove File" on target "C:\Users\WDAGUtilityAccount\Desktop\SomeBatFile.bat".
#>
# Validate removal
(Get-ChildItem -Path "$env:USERPROFILE\Desktop" -Filter '*.bat' -Recurse).FullName
# Results
<#
No results
#>
答案3
要搜索所有文件,请使用for
循环:
@echo off
cd /d "%userprofile%\desktop"
for %%a in (*.bat) do (
type "%%a"|find /i "ipconfig" && echo del "%%a"
)
还有另一种方法(看起来稍微复杂一些,但在程序员看来更优雅,因为它不必处理不包含搜索字符串的文件)。如果有很多文件(而且我意思是 A很多的)。不过,您不会注意到桌面文件夹的速度优势。
findstr /m
返回的不是找到的行,而是找到这些行的文件名。使用for /f
来捕获这些文件名并删除它们:
@echo off
for /f "delims=" %%a in ('findstr /im "ipconfig" "%userprofile%\desktop\*.bat"') do del "%%a"
(注意:您的桌面可能位于不同的位置 - 请检查)
答案4
您可以在 PowerShell 中使用Select-String
,它允许您搜索A目录 (针对特定文件类型 - 扩展名)让你找到一个图案匹配过滤的文件:
$Paths = Select-String -Path "$env:USERPROFILE\Desktop\*" -Include '*.bat','*.cmd' -Pattern 'ipconfig' | Select-Object -ExpandProperty Path
if ($null -ne $Paths) {
foreach ($Path in $Paths){
"Match found in filepath: $Path"
Remove-Item -Path $Path -WhatIf
}
}
else {
'No file found containing pattern'
}
- 默认情况下,Select-String 会在每一行中查找第一个匹配项,并且对于每个匹配项,它会显示文件名、行号以及包含该匹配项的行中的所有文本。
- 它还允许您使用正则表达式针对更复杂任务的模式匹配。
将输出存储到变量中,我们可以明确选择引用该Path
属性的完整路径。最后,我们可以添加一些简单的if
条件来评估我们的变量,并使用循环foreach
遍历捕获输出。
- 需要将输出存储到变量中(至少在这种情况下)所以文件不会继续使用 - 谢谢戴夫·汤普森指出我的错误。
仅使用这个的缺点命令是,它只允许列出AGet-ChildItem
单个目录。幸运的是,PowerShell 可以链接命令,您只需使用带有开关的命令稍微修改代码-Recurse
以允许目录(文件夹) 递归。
$Paths = Get-ChildItem -Path "$env:USERPROFILE\Desktop" -Include '*.cmd','*.bat' -Recurse |
Select-String -Pattern 'ipconfig' | Select-Object -ExpandProperty Path
if ($null -ne $Paths) {
foreach ($Path in $Paths){
"Match found in filepath: $Path"
Remove-Item -Path $Path -WhatIf
}
}
else {
'No file found containing pattern'
}
基本相同的概念,所以当你准备好时,删除-WhatIf
公共参数并且它将允许删除包含该模式的文件。