Powershell: Get-Content sem bloquear o arquivo

3

Eu preciso ler um arquivo em um computador remoto que é freqüentemente modificado. Por acaso, parece que meu script às vezes colide com uma gravação no arquivo, tornando-o inacessível. Eu não posso mudar a forma como o arquivo é escrito, então tenho que trabalhar com o que tenho.

Eu fiz um teste com um script continuamente lendo um arquivo com o Get-Content e subseqüentemente iniciando outro script que grava no arquivo em intervalos frequentes. Às vezes, a operação de gravação não era possível.

É possível que eu use o get-content em um pc remoto sem bloquear o arquivo?

    
por lcam 03.03.2017 / 12:24

2 respostas

1
[System.IO.FileStream]$fileStream = [System.IO.File]::Open("\remote\share\Text Document.txt", [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
$byteArray = New-Object byte[] $fileStream.Length
$encoding = New-Object System.Text.UTF8Encoding $true
while ($fileStream.Read($byteArray, 0 , $byteArray.Length)) {
    $encoding.GetString($byteArray)
}
$fileStream.Dispose()
    
por 04.03.2017 / 15:23
5

O conteúdo que está sendo escrito não pode ser lido ao mesmo tempo.

Como uma solução para você, você pode ler o arquivo usando a cópia de sombra. Para isso, você precisará montar uma cópia de sombra.

$s1 = (Get-WmiObject -List Win32_ShadowCopy).Create("X:\", "ClientAccessible")
$s2 = Get-WmiObject Win32_ShadowCopy | Where-Object { $_.ID -eq $s1.ShadowID }
$d  = $s2.DeviceObject + "\"   # 
cmd /c mklink /d X:\tmpshacpy "$d"

Depois disso, você pode acessar o local montado (X: \ tmpshacpy) e ler o arquivo bem.

Para desmontar a cópia de sombra após a conclusão da leitura, use $ s2.Delete ().

    
por 03.03.2017 / 12:35