You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell加载DLL后文件锁定,如何修改脚本释放文件锁?

解决PowerShell加载DLL后文件锁定的问题

嗨,这个问题我太熟悉啦!你遇到的文件锁定,根源在于[System.Reflection.Assembly]::LoadFrom()方法——它会把DLL加载到当前PowerShell的应用域中,并且一直保持文件句柄处于打开状态,自然就没法删除或修改文件了。

给你两个靠谱的解决方案,任选其一就行:

方案1:使用仅反射加载(推荐)

[System.Reflection.Assembly]::ReflectionOnlyLoadFrom()是专门为查看程序集元数据设计的方法,它只会读取DLL的元数据信息,不会执行代码,也不会锁定文件。修改你的脚本如下:

# 本地运行其实不需要Enter-PSSession,不过保留也不影响
Enter-PSSession -ComputerName $env:computername
Get-ChildItem -Path $input -Filter '*.dll' | ForEach-Object {
    # 替换成仅反射加载方法
    $assembly = [System.Reflection.Assembly]::ReflectionOnlyLoadFrom($_.FullName)
    Write-Host $assembly.FullName
}
Exit-PSSession

这个方法最直接,改动最小,完全能满足你获取FullName的需求。

方案2:从内存加载DLL字节

如果你需要更灵活的方式(比如后续还要做其他操作),可以先把DLL文件读成字节数组,再从内存加载,这样也不会持有文件句柄:

Enter-PSSession -ComputerName $env:computername
Get-ChildItem -Path $input -Filter '*.dll' | ForEach-Object {
    # 读取文件字节到内存
    $dllBytes = [System.IO.File]::ReadAllBytes($_.FullName)
    # 从字节数组加载程序集
    $assembly = [System.Reflection.Assembly]::Load($dllBytes)
    Write-Host $assembly.FullName
}
Exit-PSSession

额外提示

其实你本地运行脚本的话,Enter-PSSession和Exit-PSSession是多余的(因为本来就是本地会话),去掉它们反而更简洁,不过保留也不会有问题~

内容的提问来源于stack exchange,提问作者Chrono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:46:59