web-dev-qa-db-fra.com

Powershell: vérifier si un fichier est verrouillé

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.

19
Dech

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!

31
Dech

J'utilise ceci:

try { [IO.File]::OpenWrite($file).close();$true }
catch {$false}
20
mjolinor
$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
2
Basati Naveen