假设我有一个共享文件夹 MyShared:
用户 A 每 30 秒获取文件 \MyShared:\Foo.txt。
而且我每 28 秒后也覆盖 \MyShared:\Foo.txt (在我的 PowerShell 脚本中)
在 PowerShell 中,如何防止自己在用户获取该文件时覆盖它?(我不想破坏文件的内容或在用户检索文件时尝试覆盖它而导致出现一些错误)
如果我改写问题:如何强制 Powershell 脚本等待覆盖文件,直到另一个进程完成读取它?
假设我有一个共享文件夹 MyShared:
用户 A 每 30 秒获取文件 \MyShared:\Foo.txt。
而且我每 28 秒后也覆盖 \MyShared:\Foo.txt (在我的 PowerShell 脚本中)
在 PowerShell 中,如何防止自己在用户获取该文件时覆盖它?(我不想破坏文件的内容或在用户检索文件时尝试覆盖它而导致出现一些错误)
如果我改写问题:如何强制 Powershell 脚本等待覆盖文件,直到另一个进程完成读取它?
在某些情况下,如果文件打开,您可能无法覆盖它。
否则,您将不得不设计一些其他机制来表示读者已完成阅读。这与powershell并没有真正的关系。例如,读取器可以创建一个“锁定文件”来通知写入器该文件正在被读取,读取完成后它会删除该文件。如果锁定文件不存在,powershell 脚本可以删除该文件。
我使用这个函数来测试文件是否被锁定,但是在记事本打开的文件 txt 中,例如文件没有被锁定:
function Test-FileLock {
param (
[parameter(Mandatory=$true)]
[string]$Path
)
$oFile = New-Object System.IO.FileInfo $Path
if ((Test-Path -Path $Path) -eq $false)
{
$false
return
}
try
{
$oStream = $oFile.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
if ($oStream)
{
$oStream.Close()
}
$false
}
catch
{
# file is locked by a process.
$true
}
}
您可以使用 System.IO.File 类中的静态 Open 方法。如果您尝试打开一个文件并且它正被另一个进程使用,它将引发异常,如果您将其包装在 try/catch 块中,您将能够判断是否已引发异常,因此在catch 块,这意味着它正在使用中。
function Get-FileStatus([string]$Path)
{
try
{
[System.IO.File]::Open($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
return $false
}
catch
{
return $true
}
}
if((Get-FileStatus -Path "C:\myfile.bin"))
{
Write-Host "File in Use"
}
else
{
Write-Host "File Not in Use"
}