J'ai un problème avec l'automatisation d'un déploiement, après avoir arrêté le service, il y a toujours un verrou sur le fichier et je ne parviens pas à le supprimer. Je ne veux vraiment pas commencer à bidouiller avec le sommeil pour faire quelque chose qui "fonctionne habituellement". Existe-t-il un bon moyen de résoudre correctement le problème des fichiers verrouillés, peut-être une sorte de "attendre que le fichier soit amovible":
Get-ChildItem: l'accès au chemin "D:\MyDirectory \" est refusé.
'Test-Path' n'est pas suffisant dans ce cas car le dossier existe et j'y ai accès.
Merci à David Brabant qui a posté un lien vers cette solution sous la question initiale. Il semble que je puisse le faire en commençant par la fonction suivante:
function Test-FileLock {
param (
[parameter(Mandatory=$true)][string]$Path
)
$oFile = New-Object System.IO.FileInfo $Path
if ((Test-Path -Path $Path) -eq $false) {
return $false
}
try {
$oStream = $oFile.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
if ($oStream) {
$oStream.Close()
}
return $false
} catch {
# file is locked by a process.
return $true
}
}
Ajoutez ensuite une fonction "attendre jusqu'à" avec un délai d'attente.
Merci de votre aide!
J'utilise ceci:
try { [IO.File]::OpenWrite($file).close();$true }
catch {$false}
$fileName = "C:\000\Doc1.docx"
$file = New-Object -TypeName System.IO.FileInfo -ArgumentList $fileName
$ErrorActionPreference = "SilentlyContinue"
[System.IO.FileStream] $fs = $file.OpenWrite();
if (!$?) {
$msg = "Can't open for write!"
}
else {
$fs.Dispose()
$msg = "Accessible for write!"
}
$msg