TheCodeExpert Asked: 2021-08-18 08:55:26 +0800 CST2021-08-18 08:55:26 +0800 CST 2021-08-18 08:55:26 +0800 CST 通过命令提示符查看 .bat 文件的内容 772 我想扫描整个桌面以查找 .bat,然后查看 .bat 文件的内容,如果该文件包含项目的ipconfig,则删除该文件。有什么办法可以做到吗?我不想使用第三方工具 windows command-line 4 个回答 Voted Best Answer Reddy Lutonadio 2021-08-18T10:46:34+08:002021-08-18T10:46:34+08:00 下面的 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}} postanote 2021-08-18T16:29:13+08:002021-08-18T16:29:13+08:00 继续我的评论... # 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 #> Stephan 2021-08-18T10:21:06+08:002021-08-18T10:21:06+08:00 要搜索所有文件,请使用for循环: @echo off cd /d "%userprofile%\desktop" for %%a in (*.bat) do ( type "%%a"|find /i "ipconfig" && echo del "%%a" ) 还有另一种方法(看起来稍微复杂一些,但在程序员看来更优雅,因为它不必处理不包含搜索字符串的文件)。如果有很多文件(我的意思 是很多),这会快得多。不过,您不会注意到桌面文件夹中的速度优势。 findstr /m返回的不是找到的行,而是找到此类行的文件名。围绕for /f捕获这些文件名并删除它们: @echo off for /f "delims=" %%a in ('findstr /im "ipconfig" "%userprofile%\desktop\*.bat"') do del "%%a" (注意:您的桌面可能位于不同的位置 - 检查一下) Abraham Zinala 2021-08-18T16:10:58+08:002021-08-18T16:10:58+08:00 您可以Select-String在 PowerShell 中使用,它允许您搜索目录(针对特定文件类型 - 扩展名),允许您在过滤的文件中找到模式匹配: $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循环我们可以遍历捕获输出。 将输出存储到变量是必要的(至少在这种情况下),因此文件不会继续使用 - 感谢dave_thompson_085指出我的错误。 仅使用此cmdlet的缺点是,它只允许列出单个目录。幸运的是,PowerShell 可以链接命令,您只需使用Get-ChildItem带有-Recurse开关的 a 稍微修改代码以允许目录(文件夹)递归。 $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 common 参数,它将允许删除包含该模式的文件。
下面的 Powershell 脚本获取文件的内容
myfile.bat
,检查字符串ipconfig
是否存在。如果是,则删除该文件。要包含一个文件夹,例如您的桌面,请更改脚本,如下所示。替换
mthecodeexpert
为您的真实用户名。继续我的评论...
要搜索所有文件,请使用
for
循环:还有另一种方法(看起来稍微复杂一些,但在程序员看来更优雅,因为它不必处理不包含搜索字符串的文件)。如果有很多文件(我的意思 是很多),这会快得多。不过,您不会注意到桌面文件夹中的速度优势。
findstr /m
返回的不是找到的行,而是找到此类行的文件名。围绕for /f
捕获这些文件名并删除它们:(注意:您的桌面可能位于不同的位置 - 检查一下)
您可以
Select-String
在 PowerShell 中使用,它允许您搜索目录(针对特定文件类型 - 扩展名),允许您在过滤的文件中找到模式匹配:将输出存储到变量中,我们可以显式选择引用该
Path
属性的完整路径。最后,我们可以添加一些简单的if
条件来评估我们的变量,并使用foreach
循环我们可以遍历捕获输出。仅使用此cmdlet的缺点是,它只允许列出单个目录。幸运的是,PowerShell 可以链接命令,您只需使用
Get-ChildItem
带有-Recurse
开关的 a 稍微修改代码以允许目录(文件夹)递归。基本上是相同的概念,所以当你准备好时,删除
-WhatIf
common 参数,它将允许删除包含该模式的文件。