我编写了一个函数来检查共享网络驱动器中的另一个进程/用户是否正在使用/锁定一个excel文件,如果使用了该文件,请暂停该脚本并继续检查直到下一个操作可用为止将其移出文件夹。但是,当我使用System.IO读取文件时,它不会打开文件。我已经在本地驱动器上进行了测试,但这确实可以打开文件,但是在网络驱动器中不起作用吗?
$IsLocked = $True
Function Test-IsFileLocked {
[cmdletbinding()]
Param (
[parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[Alias('FullName','PSPath')]
[string[]]$Path
)
Process {
while($isLocked -eq $True){
If ([System.IO.File]::Exists($Path)) {
Try {
$FileStream = [System.IO.File]::Open($Path,'Open','Write')
$FileStream.Close()
$FileStream.Dispose()
$IsLocked = $False
} Catch {
$IsLocked = $True
echo "file in use, trying again in 10 secs.."
Start-Sleep -s 10
}
}
}
}
}
这是代码无法拾取/打开我函数中的excel文件的地方
$FileStream = [System.IO.File]::Open($Path,'Open','Write')
程序在此处调用该函数。在网络驱动器中的某个项目文件夹中循环浏览,如果该项目与模式匹配,则将调用该函数以检查文件是否正在使用:
$DirectoryWithExcelFile = Get-ChildItem -Path "Z:\NetworkDriveFolder\"
$DestinationFolder = "Z:\DestinationFolder\"
$pattern = "abc"
foreach($file in $DirectoryWithExcelFile){
if($file.Name -match $pattern){
Test-IsFileLocked -Path $file
$destFolder = $DestinationFolder+$file.Name
Move-item $file.FullName -destination $destFolder
break
}
}
答案 0 :(得分:0)
您必须将close放入并放置在try的最后部分,因此,如果它抛出异常,则将其丢弃。不能保证它是文件锁定异常,因此最好是throw
异常,捕获您期望的异常或write it out
$IsLocked = $True
Function Test-IsFileLocked {
[cmdletbinding()]
Param (
[parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[Alias('FullName','PSPath')]
[string]$Path
)
Process {
while($isLocked -eq $True){
If ([System.IO.File]::Exists($Path)) {
Try {
$FileStream = [System.IO.File]::Open($Path,'Open','Write')
$IsLocked = $False
} Catch [System.IO.IOException] {
$IsLocked = $True
echo "file in use, trying again in 10 secs.."
Start-Sleep -s 10
} Catch {
# source https://stackoverflow.com/questions/38419325/catching-full-exception-message
$formatstring = "{0} : {1}`n{2}`n" +
" + CategoryInfo : {3}`n" +
" + FullyQualifiedErrorId : {4}`n"
$fields = $_.InvocationInfo.MyCommand.Name,
$_.ErrorDetails.Message,
$_.InvocationInfo.PositionMessage,
$_.CategoryInfo.ToString(),
$_.FullyQualifiedErrorId
$formatstring -f $fields
write-output $formatstring
} finally {
if($FileStream) {
$FileStream.Close()
$FileStream.Dispose()
}
}
}
}
}
}
编辑:
路径应该是一个字符串,而不是字符串数组,除非您有多个路径,在这种情况下,应重命名为$Paths
并遍历它们$Paths| % { $Path = $_; #do stuff here }