net files / close无法按预期工作

时间:2017-04-18 07:51:22

标签: powershell

我们有许多在网络位置执行的自编应用程序。每当开发人员想要发布此应用程序的新版本时,我必须关闭应用程序所在服务器上的所有打开文件,方法是:

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的行为与手动关闭文件不同?
  • 是否有本机PowerShell方法来执行此操作?
  • 是否有最后退出代码列表,所以我可以进一步解决这个问题?

谢谢!

0 个答案:

没有答案