Контекст: нам нужно запустить скрипт выхода, который сохраняет некоторые локальные файлы в удаленном месте. Поскольку некоторые пользователи используют медленное VPN-соединение, мы сжимаем их, используя 7z, и загружаем только те файлы, которые изменились с прошлого раза. Проблема заключается в запуске процесса, который не ожидает 7z для правильного завершения, когда сценарий запускается событием выхода из системы.
Вот часть моего сценария:
$7z = "C:\Program Files\7-Zip\7z.exe"
$files = @("file1.config","file2.nsf") # more files in real
$archiveFile = "C:\temp\archive.7z"
function get-md5{
param(
[parameter(Mandatory=$true)]$file
)
if (! (test-path $file)){
"$file n'est pas accessible"
}else{
$methode = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$stream = [System.IO.File]::Open( $file , [System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
$hash = [System.BitConverter]::ToString($methode.ComputeHash($stream))
($hash -split("-") -join("")).toLower()
$stream.close();
}
}
"Zipping"
start-process $7z -ArgumentList "a -mx7 $archiveFile $files" -NoNewWindow -Wait -RedirectStandardError "D:\7zErrLog.txt" -RedirectStandardOutput "D:\7zLog.txt"
$md5 = get-md5 $archiveFile
##Continue Script : If md5 has changed, upload to server...
Iполучаю эту ошибку:
The process cannot access the file <filename here> because it is being used by another process
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
[...]
Я использовал handle64.exe из sysInternals и обнаружил, что get-md5 не может открыть файл в режиме чтения, потому что 7z.exe все еще блокирует его...
Если я запускаю сценарий вручную (а не когда пользователь выходит из системы), сценарии работают нормально.
Любая помощь приветствуется