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
相关产品推荐
相关产品推荐

