我们有许多在网络位置执行的自编应用程序。每当开发人员想要发布此应用程序的新版本时,我必须关闭应用程序所在服务器上的所有打开文件,方法是:
computer management > Shared Folders > Opened Files
然后选择应用程序的所有文件 - 右键单击并关闭。
我希望开发人员通过PowerShell自己完成,所以我编写了一个Unlock-Files
函数。函数的这一部分应该通过net files $id /close
调用关闭文件:
$result = Invoke-Command -ComputerName $server -Credential $cred -ArgumentList $workpath, $server {
param($workpath,$server)
$list = New-Object System.Collections.ArrayList
$ErrorActionPreference = "SilentlyContinue"
$adsi = [adsi]"WinNT://./LanmanServer"
$resources = $adsi.psbase.Invoke("resources") | % {
[PSCustomObject] @{
ID = $_.gettype().invokeMember("Name","GetProperty",$null,$_,$null)
Path = $_.gettype().invokeMember("Path","GetProperty",$null,$_,$null)
OpenedBy = $_.gettype().invokeMember("User","GetProperty",$null,$_,$null)
LockCount = $_.gettype().invokeMember("LockCount","GetProperty",$null,$_,$null)
}
}
$resources | ? { $_.Path -like $workpath } | tee -Variable Count | % {
$id = $_.ID
net files $id /close > $null
if ($LASTEXITCODE -eq 0) { $list.add("File successfully unlocked $($_.path)") > $null }
else { $list.add("File not unlocked (maybe still open somewhere): $($_.path)") > $null }
}
if (!( ($count.count) -ge 1 )) { $list.add("No Files to unlock found in $workpath on $server") > $null }
$list
}
我希望net files /close
的行为与我在上述服务器上直接进行的手动方式相同,但它根本不会表现得像这样。它有时会关闭文件,有时不会。但它永远不会关闭所有必需的文件,因此开发人员无法发布他的应用程序。另外,net files
几乎永远不会以LastExitCode 0
结束,但我无法理解为什么。
net files
真正关闭所有文件?net files
的行为与手动关闭文件不同?谢谢!