通过命令提示符查看.bat 文件的内容

通过命令提示符查看.bat 文件的内容

我想扫描整个桌面以查找 .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 公共参数并且它将允许删除包含该模式的文件。

相关内容