我需要读取远程电脑上经常修改的文件。碰巧的是,我的脚本似乎有时会与文件的写入发生冲突,导致文件无法访问。我无法更改文件的写入方式,因此只能使用现有方式。
我进行了一个测试,让一个脚本不断使用 Get-Content 读取文件,然后启动另一个脚本,该脚本会频繁地写入文件。有时,写入操作无法进行。
我是否可以在远程 PC 上使用 get-content 而不锁定文件?
答案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()
答案2
正在写入的内容无法同时被读取。
作为一种解决方案,您可以使用卷影副本读取文件。为此,您需要安装卷影副本。
$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.Delete()。