CMD/Batch/Powershell 通配符搜索和删除具有保留名称的文件(在所有子目录中)

CMD/Batch/Powershell 通配符搜索和删除具有保留名称的文件(在所有子目录中)

首先抱歉,我几天前问过这个问题,但因为留下了一些敏感信息,所以不得不删除。我本想编辑一下,但得到的回复却重复了同样的信息(对不起 harrymc!)

我们在运行 Win Server 2012 R2 的 Web 服务器上有大量资产遭到入侵并被注入了文件,例如:

  • LPT3.H3EgW.asp
  • LPT7.PVYMnLcu2.asp
  • 辅助功能.Ayqgg1e.asp
  • CON.9w84pu.cer

无法通过资源管理器删除这些,因为它会返回无效的文件句柄,因为文件名中包含保留字。

我可以使用以下方法删除它们:

del \\.\D:\path_to_file\CON.9w84pu.cer

我希望能够在主父目录中 搜索所有子目录以查找类似LPT3.*.asp(和/或) 的模式,并删除找到的任何内容。包含许多 vhost 目录,所以我希望能够一次性找到它们。LPT*.*.aspD:\inetpub\

我在 PowerShell 中尝试了以下操作:

Get-Childitem -path D:\inetpub\ -Filter *.asp -Recurse | where-object {$_.Name -ilike "LPT3.*.asp"} | Remove-Item -Force

但返回的内容是:“Remove-Item:无法删除项目。\LPT3:找不到文件”。

还尝试在父目录中的命令行中进行以下操作

del /Q /F /S "LPT3.*.asp"

但返回的结果为:“文件名、目录名或卷标语法不正确。”

用户 harrymc 建议:

cd /mnt/d/inetpub
rm `find . -name 'LPT3.*.asp' -print`

但这涉及安装 WSL,我现在想避免安装其他东西,看看是否可行。

2021 年 8 月 20 日更新:

根据用户 harrymc 的评论尝试了以下操作:

Get-Childitem -path \\?\d:\inetpub\ -Filter *.asp -Recurse | where-object {$_.Name -ilike "LPT7.*.asp"} | Remove-Item -Force

没有收到错误,并且 PowerShell(以管理员身份运行)返回了一个新行,准备执行下一个命令,因此看起来它可能已经起作用了,但是当我检查目录时,该文件仍然在那里。

有趣的是,我将上面的行改为更激进的行(它位于 vhosts 目录中,该目录中不应该有任何 .asp 文件)

Get-Childitem -path d:\inetpub\domainname.co.uk\httpdocs\ -Filter *.asp -Recurse | Remove-Item -Force

并得到以下内容:

Remove-Item : Cannot remove item \\.\LPT7: Could not find file
'D:\inetpub\domainname.co.uk\httpdocs\images\LPT7.PVYMnLcu2.asp'.
At line:1 char:85
+ ... asp -Recurse | Remove-Item -Force
+                    ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (D:\inetpub\doma...7.PVYMnLcu2.asp:FileInfo) [Remove-Item], FileNotFoundExce
   ption
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand

在第一行中,PowerShell 知道它需要\\.\(就像在 CMD del 命令中一样)但是如果我尝试在路径的开头使用它,我会得到“Get-Childitem:不支持给定路径的格式。”

有没有办法我可以使用批处理文件来查找并循环遍历匹配的项目,然后使用命令del \\.\D:\path_to_found_file\LTP3.foundfilename.asp并插入要删除的文件名?

答案1

如果Get-Childitem可以列出这些文件,我建议将文件名写入名为的文本文件f.bat,使用文本编辑器将列表转换为del \\?\d:\...,然后执行批处理文件。

此 PowerShell 命令可以获取起始列表:

Get-Childitem -path d:\inetpub\domainname.co.uk\httpdocs\ -Filter *.asp -Recurse | Select-Object -Property FullName | Out-File -FilePath .\f.bat

答案2

所以我最终选择了这个并放弃了 PowerShell 路线。

虽然它不漂亮也不优雅,但是却很管用。

SET "patterncon=CON"
SET "pattern=LPT1"
SET "pattern2=LPT2"
SET "pattern3=LPT3"
SET "pattern4=LPT4"
SET "pattern5=LPT5"
SET "pattern6=LPT6"
SET "pattern7=LPT7"
SET "pattern8=LPT8"
SET "pattern9=LPT9"
SET "pattern10=AUX"
SET "pattern11=CON"
SET "pattern12=PRN"
SET "pattern13=COM1"
SET "pattern14=COM2"
SET "pattern15=COM3"
SET "pattern16=COM4"
SET "pattern17=COM5"
SET "pattern18=COM6"
SET "pattern19=COM7"
SET "pattern20=COM8"
SET "pattern21=COM9"

FOR /R "D:\inetpub" %%# in (*.cer) DO (
    ECHO %%~nx# | FIND "%patterncon%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%# 
    )
)

FOR /R "D:\inetpub" %%# in (*.asp) DO (
    ECHO %%~nx# | FIND "%pattern%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern2%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern3%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern4%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern5%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern6%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern7%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern8%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern9%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern10%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern11%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern12%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern13%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern14%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern15%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern16%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern17%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern18%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern19%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern20%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
    ECHO %%~nx# | FIND "%pattern21%" 1>NUL && (
        Echo \\.\%%#
        del \\.\%%#
    )
)

相关内容