Мой скрипт обычно предполагает наличие файла * .txt с настройками, которые помогают ему функционировать лучше. Однако, если скрипт не существует, он создает локальный файл для хранения этих настроек. Я понимаю, что нет логической необходимости , чтобы затем прочитать этот файл, но я хотел бы понять, почему я не могу.
[void][System.IO.File]::Create($PSFileName)
$ReadPS = New-Object System.IO.StreamReader($PSFileName)
Сразу после сценария может (редко) создает файл, он пытается прочитать его, что приводит к следующей ошибке: New-Object : Exception calling ".ctor" with "1" argument(s): "The process cannot access the file 'C:\Temp\MyFile.txt' because it is being used by another process."
Итак, я должен ждать, пока файл будет доступен, верно? Тем не менее, простой старт-сон на 5 секунд не работает. Но если я заверну его в al oop с помощью try-catch, он будет срабатывать каждый раз в доли секунды:
[void][System.IO.File]::Create($PSFileName)
$RCount = 0 # if new file created, sometimes it takes a while for the lock to be released.
Do{
try{
$ReadPS = New-Object System.IO.StreamReader($PSFileName)
$RCount+=100
}catch{ # if error encountered whilst setting up StreamReader, try again up to 100 times.
$RCount++
Start-Sleep -Milliseconds 1 # Wait long enough for the process to complete. 50ms seems to be the sweet spot for fewest loops at fastest performance
}
}Until($RCount -ge 100)
$ReadPS.Close()
$ReadPS.Dispose()
Это слишком запутанно. Почему файл остается заблокированным в течение произвольного промежутка времени, который, кажется, увеличивается, чем дольше я его жду? Можно ли что-то изменить или добавить между созданием файла и StreamReader, чтобы обеспечить доступность файла?