3

Мне нужно прочитать файл на удаленном компьютере, который часто изменяется. Так получилось, что мой скрипт иногда сталкивается с записью в файл, что делает его недоступным. Я не могу изменить способ записи файла, поэтому мне приходится работать с тем, что у меня есть.

Я запустил тест, имея скрипт, постоянно читающий файл с помощью Get-Content, и впоследствии запускающий другой скрипт, который записывает в файл с частыми интервалами. Время от времени операция записи была невозможна.

Возможно ли использовать get-content на удаленном компьютере без блокировки файла?

2 ответа2

6

Записываемый контент не может быть прочитан одновременно.

Как решение для вас, вы можете прочитать файл, используя теневую копию. Для этого вам нужно будет смонтировать теневую копию.

$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"

После этого вы можете получить доступ к смонтированному местоположению (X:\tmpshacpy) и просто прочитать файл.

Чтобы размонтировать теневую копию после завершения чтения, используйте $ s2.Удалять().

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .