Questão Powershell: Get-Content sem bloquear o arquivo


Eu preciso ler um arquivo em um pc 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 eu tenho que trabalhar com o que tenho.

Eu fiz um teste fazendo 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 get-content em um PC remoto sem bloquear o arquivo?


2


origem




Respostas:


[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()

1



Obrigado pela sua entrada, no entanto, isso ainda bloqueia o arquivo para uma gravação, se o meu teste está correto. - lcam
Como você realiza seu teste? Eu não recebi nenhum bloqueio durante o teste deste snippet de código. - t1meless
Não importa, meu teste estava de fato incorreto. Eu pesquisei um pouco para poder modificar seu código para ler as últimas duas linhas do arquivo, em vez de ler todo o material, pois isso estava demorando e entrando em conflito com uma gravação. Isso parece ter resolvido o problema, obrigado! - lcam


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

Como uma solução para você, você poderia ler o arquivo usando uma 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 ().


5



Obrigado pela sua contribuição. Eu li sobre esse recurso e parece incrível, no entanto eu esqueci de mencionar que eu preciso disso em um computador remoto. - lcam
"Esqueci de mencionar que preciso disso em um computador remoto" Use Invoke-Command para isso. - Ƭᴇcʜιᴇ007
Você pode usar comandos remotos muito bem (com invocação) e você terá que fornecer credenciais (apenas outro parâmetro adicional). - Overmind
Obrigado a todos. Infelizmente, é compreensível levar algum tempo para criar e montar a cópia de sombra no pc remoto, e eu preciso deste script para passar por cima de 100 PCs um após o outro ... mas talvez eu esteja pedindo o impossível agora. Se houvesse alguma maneira de obter uma cópia de sombra de um único arquivo ... Obrigado mesmo assim! - lcam
Se a sombra estiver montada, você pode copiar um único arquivo dessa montagem, não deve haver problema aqui. - Overmind