Powershell:在不锁定文件的情况下获取内容

lca*_*cam 7 powershell filesystems

我需要读取经常修改的远程电脑上的文件。碰巧的是,我的脚本有时似乎与文件上的写入发生冲突,使其无法访问。我无法更改文件的写入方式,因此我必须使用我拥有的内容。

我通过让脚本使用 Get-Content 连续读取文件并随后启动另一个脚本来运行测试,该脚本以频繁的间隔写入文件。有时,写操作是不可能的。

是否可以在不锁定文件的情况下在远程 PC 上使用 get-content?

Ove*_*ind 9

正在写入的内容无法同时读取。

作为您的解决方案,您可以使用卷影副本读取文件。为此,您需要安装一个卷影副本。

$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"
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以访问安装位置(X:\tmpshacpy)并读取文件就好了。

要在读取完成后卸载卷影副本,请使用 $s2.Delete()。


小智 5

[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()
Run Code Online (Sandbox Code Playgroud)