https://docs.microsoft.com/en-us/sysinternals/downloads/handle>>> 我在此网站上下载了该文件。一切都很好,但我无法完全按照自己的意愿行事。我用视频准确地解释了我想要的内容。我正在编写一个应用程序。我已将其设置为通过 CMD 工作。如何使用 CMD 中的单个代码关闭指定的目录?我想在不需要 handles-id 的情况下执行此操作。我想将其准备为代码。请帮助我。 :(
这段代码的工作原理如下。但我想在不需要 handle-id 的情况下执行此操作。
handle -c 0x1a2c -p Notepad.exe
我想这样做。但是不行。
handle -c C:\Users\dream -p notepad.exe
我想像这个视频中那样做。如何使用 cmd 命令执行此操作?我只想指定一个句柄目录。示例: https://www.youtube.com/watch?v=cC2-5PPpLBo
答案1
危险!强行关闭手柄可能会导致级联故障和数据损坏在目标过程中。
如果您无论如何都想这样做,可以使用下面的 PowerShell 脚本。它需要两个参数:目标进程的名称,然后是要关闭句柄的文件/目录的路径。它要求handle
将实用程序放在同一目录中。
$targetPid = $null
$targetFile = $args[1]
.\handle -p $args[0] | % {
If ($_ -match 'pid: (\d*) ') {
$targetPid = $Matches[1]
} ElseIf ($_ -match '([0-9A-F]*): File.{10}(.*)') {
If ($Matches[2] -eq $targetFile) {
.\handle -c $Matches[1] -p $targetPid -y | Out-Null
}
}
}
首先,它调用handle
列出目标进程的句柄。然后它循环遍历输出行,并使用以下代码对其进行解析:常用表达。当它看到指定目标进程 PID 的行时,它会记录下来以供以后使用。当它稍后看到有关文件句柄的行时,它会检查该文件是否是作为命令行参数指定的文件,如果是,则handle
再次调用以关闭它。
如果脚本保存为handleclose.ps1
,您可以从命令提示符运行它,如下所示:
powershell -ExecutionPolicy Bypass -c .\handleclose.ps1 TargetProcess.exe 'C:\path\to\file'
提示:如果你正在寻找一种 GUI 方式来查看和关闭句柄,Sysinternals进程探索器可以做到这一点。
答案2
如果目的是终止一个进程,其中发现可执行文件的名称和正在使用的某个文件的路径,它们在给定的 PID 中重合...
在命令行中:
wmic process where "name like '%notepad.exe%' and commandline like '%C:\\Users\\dream%'" delete
在 bat/cmd 文件中:
wmic process where "name like '%%notepad.exe%%' and commandline like '%%C:\\Users\\dream%%'" delete
在 PowerShell 中使用Get-WmiObject
:
Get-WmiObject Win32_Process | % { if ($_.ProcessName -like '*Notepad.exe*' -and $_.CommandLine -like '*C:\Users\dream*') {kill $_.ProcessId}}
使用Get-CimInstance Win32_Process
:
Get-CimInstance Win32_Process -Filter "name='notepad.exe'" | % { if ($_.CommandLine -like '*C:\Users\dream*') {kill $_.ProcessId}}
# Or....
Get-CimInstance Win32_Process -Filter "name='notepad.exe'" |
% { if ($_.CommandLine -like '*C:\Users\dream*') {kill $_.ProcessId}}
其他资源:
答案3
使用 csv 输出和 powershell,这非常简单。现在你需要数字 PID 来关闭句柄,否则你只会得到使用帮助消息。Handle64.exe 可能会在执行这些操作时崩溃,唯一的选择可能是重新启动以以同一用户身份再次运行句柄。是/否提示在invoke-command 上不起作用。
handle js2010 -p emacs -nobanner -v | convertfrom-csv
Process : emacs.exe
PID : 12616
Type : File
Handle : 0x00000040
Name : C:\Users\js2010
它询问 y/n 而我回答 n。$name 和 $process 可以是部分匹配。
$name = 'js2010'
$process = 'emacs'
handle $name -p $process -nobanner -v | convertfrom-csv |
% { handle -nobanner -c $_.Handle -p $_.PID }
40: File C:\Users\js2010
Close handle 40 in emacs.exe (PID 12616)? (y/n) n
Handle close aborted.