Olá Pessoal,
Muitas vezes quando criamos um objeto no powershell, se nao executarmos o método Dispose() além de permanecer alocado em memória, o recurso pode travar outros, por exemplo, um arquivo que nao pode ser editado por aparentar estar em uso por outro processo, ou uma conexão com banco de dados que não foi encerrada e permanece consumindo recursos locais e do servidor remoto.
Isso é um problema comum em vários sistemas e scripts no dia a dia e o motivo disso é que os recursos ficam em memória até o garbage collector do .net execute e libere a memória, porém a melhor prática é lidar com isso diretamente no código para manter a performance e o uso de recursos baixo.
No C# é possivel criar um bloco using que cria um tipo de “contexto” para uma variável e ao final do bloco chama o método dispose automaticamente, via powershell a solução padrão seria chamar o método dispose ao final para liberar a memória, porém não há nativamente um recurso similar.
Há um tempo atrás me deparei com um artigo que emula a função no Powershell, infelizmente não me recordo o nome do autor para dar o devido credito, mas é algo que acabo utilizando com frequência no dia a dia.
método tradicional:
$streamWriter = New-Object System.IO.StreamWriter("$pwd\newfile.txt")
$streamWriter.WriteLine('Linha escrita com Powershell')
$streamWriter.Dispose()
exemplo emulando a função using do c# no powershell:
Using-Object -InputObject ($streamWriter = New-Object System.IO.StreamWriter("$pwd\newfile.txt")) -ScriptBlock {
$streamWriter.WriteLine('Linha escrita com Powershell')
}
Particularmente prefiro a segunda maneira, já que ela sempre irá executar o dispose ao final e fica um pouco mais legível.
Função Using-Object
:
function Using-Object
{
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[AllowEmptyString()]
[AllowEmptyCollection()]
[AllowNull()]
[Object]
$InputObject,
[Parameter(Mandatory = $true)]
[scriptblock]
$ScriptBlock
)
try
{
. $ScriptBlock
}
finally
{
if ($null -ne $InputObject -and $InputObject -is [System.IDisposable])
{
$InputObject.Dispose()
}
}
}
Dúvidas? Sugestões? Comente!
Até a próxima!