如何强制powershell刷新缓存数据?PSDrive 的 Get-ChildItem 结果不是最新的

Jim*_*rch 5 iis powershell

Import-Module WebAdministration
$pool = "ChannelServices"
$wp = Get-ChildItem "IIS:\AppPools\$pool\WorkerProcesses"
Get-Process -Id $wp.processId
Restart-WebAppPool $pool
sleep 5
Get-ChildItem "IIS:\AppPools\$pool\WorkerProcesses"
Get-Process -Id $wp.processId
Run Code Online (Sandbox Code Playgroud)

因此,当我为特定 AppPool 的 WorkerProcesses 执行 Get-ChildItem,然后重新启动该 AppPool 时,我应该获得一个新的 PID,我确实这么做了。但是,重新运行 Get-ChildItem 仍显示旧的 PID。如果我关闭 Powershell 并重新打开,它将不会显示正确的新 PID。

我怎样才能强制Powershell清除它的缓存,或者任何保存不正确信息的东西......

显示 Get-ChildItem 如何不使用新的 PID 进行更新。

更新 需要明确的是,我的问题是如何在使用 IIS PSDrive 时清除本地缓存。

我注意到 TypeName:Microsoft.IIs.PowerShell.Framework.ConfigurationElement#workerProcesses#workerProcess

有一个方法: Name MemberType Definition
---- ---------- ----------
ClearLocalData Method void ClearLocalData()

但它对我来说并没有真正起作用......就像下面的人所说,这可能只是一个错误。

我在下面看到了有关如何使用我所知道的 WMI 的答案。

@theJasonHelmick 提供了一个很好的:

GWMI win32_process -filter "name='w3wp.exe'" | Select Name, ProcessId, @{n='AppPool';e={$_.GetOwner().user}}
Run Code Online (Sandbox Code Playgroud)

这为我提供了运行 AppPool 的用户名。我对此进行了一些修改,以从命令行中提取实际的应用程序池名称:

Get-WmiObject -Class win32_process -filter "name='w3wp.exe'" | Select Name, ProcessId, @{n='AppPool';e={($_.CommandLine).Split("`"")[1]}}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ikE 1

除非我完全遗漏了一些东西,否则我猜您将第一个获取过程存储在变量中$wp,然后再次引用该变量将返回旧数据?

如果您执行以下任一操作怎么办:

  • 第二次运行get-childitem再次存储在$wp(覆盖该值)?
  • 在再次使用变量之前删除它:

    删除变量wp

  • 将第二个存储get-childitem在具有完全不同名称的变量中?

我非常喜欢remove-variable自己,因为旧的价值观确实会带来意想不到的怪异。


[编辑] Peter Hahndorf 的答案似乎是微软认可的替代方案,尽管我现在已经放错了链接。但由于该行为的原因确实似乎是一个可能的错误,我将补充以下内容:

这家伙似乎已经使用 C# 以最有效的方式解决了回收应用程序池的问题。如果速度至关重要(WMI 通常比较耗时),例如必须在短时间内进行大量回收,那么这可能值得考虑。

%WinDir%\system32\Inetsrv\Microsoft.Web.Administration.dll如果只是先将解决方案加载到 shell 中以访问命名空间,那么将解决方案移植到 Powershell 看起来并不难。

代码的原始参考点似乎来自 Microsoft这里