Como forçar o powershell a atualizar dados em cache? Resultados Get-ChildItem para PSDrive não atual

3
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

Então, quando eu faço um Get-ChildItem para o WorkerProcesses de um AppPool específico, então reinicio esse AppPool, eu devo pegar um novo PID, o que eu faço. No entanto, reexecutar Get-ChildItem ainda mostra o PID antigo. Se eu fechar o Powershell e reabrir, ele não mostrará o novo PID correto.

Como posso forçar o Powershell a limpar seu cache, ou o que quer que seja que esteja armazenando informações incorretas ...

UPDATESóparaficarclaro,minhaperguntaécomopossolimparocachelocalaousaroPSDrivedoIIS.

EunoteioTypeName:Microsoft.IIs.PowerShell.Framework.ConfigurationElement#workerProcesses#workerProcess

Temummétodo:NomeMemberTypeDefinition
------------------------
MétodoClearLocalDatavoidClearLocalData()

Masrealmentenãofuncionouparamim...Comoalguémabaixoafirmou,issopodeserapenasumbug.

VejaabaixoasrespostassobrecomousaroWMI,oqueestouciente.

@theJasonHelmickofereceuumaboa:

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

Isso me dá o nome de usuário em que o AppPool está sendo executado. Eu modifiquei um pouco para puxar o nome real do apppool da CommandLine:

Get-WmiObject -Class win32_process -filter "name='w3wp.exe'" | Select Name, ProcessId, @{n='AppPool';e={($_.CommandLine).Split("'"")[1]}}
    
por Jim March 03.01.2014 / 16:18

4 respostas

3

Eu poderia reproduzir esse comportamento no IIS 8.5, parece um bug para mim.

Usando o WMI trabalhado para mim na mesma sessão do PowerShell em que o Get-ChildItem retornou o PID desatualizado

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

Isso retornou o pid correto para o primeiro WorkerProcess

    
por 03.01.2014 / 20:47
1

A menos que eu esteja totalmente perdendo alguma coisa, eu estou supondo que você está armazenando o primeiro processo get na variável $wp , então referenciar a variável novamente retornará os dados antigos?

E se você fizer um dos seguintes:

  • pela segunda vez executando get-childitem novamente armazenando em $wp (sobrescrevendo o valor)?
  • apague a variável antes de usá-la novamente:

    remove-variable wp

  • armazena o segundo get-childitem em uma variável com um nome totalmente diferente?

Sou um grande fã de remove-variable , já que os valores antigos podem realmente causar estranhezas inesperadas.

[EDITAR] A resposta de Peter Hahndorf parece ser a alternativa endossada pela Microsoft, embora eu tenha perdido o link para isso. Mas como a causa do comportamento de fato parece ser um possível bug, vou apenas complementar com o seguinte:

Esse cara parece ter resolvido o problema de reciclar pools de aplicativos da maneira mais eficiente usando C #. Se a velocidade é essencial (o WMI normalmente está no lado que consome tempo), como se alguém devesse fazer um grande número de reciclagens em um curto período de tempo, isso poderia valer a pena.

Não parece muito difícil portar a solução para o Powershell, se apenas carregarmos o %WinDir%\system32\Inetsrv\Microsoft.Web.Administration.dll no shell primeiro para acessar o namespace.

O ponto de referência original para o código parece vir da Microsoft aqui .

    
por 03.01.2014 / 16:35
1

Respondendo a uma pergunta antiga, já que essa é a principal coisa em uma pesquisa do Google sobre o meu problema e não tem a minha solução.

Estou assistindo a um arquivo para atualizações e usando Get-ChildItem para obter uma referência a ele.

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

Eu simplesmente repito a linha acima toda vez que eu quiser atualizar $ output

Embora eu saiba que o arquivo está aumentando em tamanho, $ output.length ficaria. Seria bom se eu atingisse o F5 no diretório.

Usar $ output.refresh atualizou o objeto sem precisar reatribuí-lo.

    
por 27.04.2017 / 15:05
0

Se você precisar atualizar o cache de processos de trabalho, basta remover e importar o Módulo de Administração da Web novamente.

Remove-Module WebAdministration
Import-Module WebAdministration

Provavelmente não é a melhor solução como a que utiliza o WMI, mas se por algum motivo você não tiver acesso aos objetos WMI do IIS ou não puder instalá-los, isso funcionará.

    
por 15.08.2018 / 19:00