0

我有多个网站 - 每个网站都在一个单独的应用程序池中。我指的应用程序池有 1 个工作进程。停止应用程序池后,我正在尝试等待并验证工作进程是否已停止。

$appPoolName = $appPool.name;
    
    Write-Host "appPoolName: $appPoolName";

    $w3wp = Get-ChildItem "IIS:\AppPools\$appPoolName\WorkerProcesses\";

    while($w3wp -and $retrys -gt 0)
    {
        Write-Host "w3wp value is: $w3wp";

        Start-Sleep -s 10;
        $retrys--;
        
        $w3wp = Get-ChildItem "IIS:\AppPools\$appPoolName\WorkerProcesses\";

        Write-Host "w3wp value(2) is: $w3wp";

        if(-not $w3wp)
        {
            break;
        }
    }

这两个值的打印始终是“Microsoft.IIs.PowerShell.Framework.ConfigurationElement”,即使我看到进程已停止并且不再在任务管理器中。

也很奇怪:当我在代码运行并调用时打开另一个 PowerShell 会话时

 $w3wp = Get-ChildItem "IIS:\AppPools\$appPoolName\WorkerProcesses\";

w3wp 没有价值(因为它不再存在)。

任何想法为什么价值没有改变?或者也许如何以不同的方式做到这一点?

提前致谢 :)

4

1 回答 1

1

我认为IIS:提供者正在缓存数据。我不知道修复方法,但这里有几个替代方案:

从 powershell 使用 WMI: gwmi -NS 'root\WebAdministration' -class 'WorkerProcess' | select AppPoolName,ProcessId

运行 appcmd appcmd list wp

于 2021-04-22T17:01:47.897 回答