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

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 

所以,当我为一个特定的AppPool的WorkerProcesses做一个Get-ChildItem,然后重新启动这个AppPool,我应该得到一个新的PID,这是我做的。 但是,重新运行Get-ChildItem仍然显示旧的PID。 如果closuresPowershell并重新打开,它将不会显示正确的新PID。

我怎样才能强制Powershell清除它的caching,或者是否存在那些不正确的信息…

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

更新只是要清楚,我的问题是如何使用IIS PSDrive清除本地caching。

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

有一个方法:名称MemberType定义
—- ———- ———-
ClearLocalData方法void ClearLocalData()

但它并没有真正为我工作…像下面的人说,这可能只是一个错误。

我看到如何使用WMI的答案,我知道。

@JasonHelmick提供了一个很好的:

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

这给了我AppPool正在运行的用户名。 我修改了一下,从CommandLine中取出实际的应用程序名称:

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

我可以重现IIS 8.5上的这种行为,它看起来像一个bug。

在Get-ChildItem返回过期的PID的同一个PowerShell会话中,使用WMI为我工作

 (gwmi -NS 'root\WebAdministration' -class 'WorkerProcess' | ? AppPoolName -eq $pool | Select -First 1).ProcessId 

这为第一个WorkerProcess返回了正确的pid

除非我完全错过了某些东西,否则我猜测你将第一个获取过程存储在variables$wp然后再次引用该variables将返回旧数据?

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

  • 第二次运行get-childitem再次存储在$wp (覆盖值)?
  • 在再次使用之前清除variables:

    删除variableswp

  • 将第二个get-childitem存储在一个完全不同名称的variables中?

我很喜欢remove-variable我自己remove-variable ,因为旧的价值观真的会引起意想不到的诡异。


[编辑]彼得·汉多夫(Peter Hahndorf 的答案似乎是微软认可的替代scheme,尽pipe现在我已经错误地将链接放在了这个链接上。 但是,由于行为的原因确实似乎是一个可能的错误,我只会补充以下内容:

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

将解决scheme移植到Powershell并不难,只要将%WinDir%\system32\Inetsrv\Microsoft.Web.Administration.dll加载到shell中首先访问命名空间。

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

回答一个老问题,因为这是谷歌search我的问题的最重要的东西,并没有我的解决scheme。

我正在观察文件的更新,并使用Get-ChildItem来获取对它的引用。

 $output = Get-ChildItem -Path $path -File $file | Where-Object -FilterScript {($_.LastWriteTime -gt $DateNow)} 

每次我想刷新$输出时,我只是重复上面的行

虽然我知道文件的大小正在增加,$ output.length会坚持下去。 如果我在目录中点击F5就可以了。

使用$ output.refresh刷新对象而不需要重新分配它。