J'essaie de trouver une solution qui vérifiera si un fichier est utilisé par un autre processus. Je ne veux pas lire le contenu du fichier, comme sur un document de 7 Go, cela pourrait prendre un certain temps. Actuellement, j'utilise la fonction mentionnée ci-dessous, ce qui n'est pas idéal car le script prend environ 5 à 10 minutes pour récupérer une valeur.
function checkFileStatus($filePath)
{
write-host (getDateTime) "[ACTION][FILECHECK] Checking if" $filePath "is locked"
if(Get-Content $filePath | select -First 1)
{
write-host (getDateTime) "[ACTION][FILEAVAILABLE]" $filePath
return $true
}
else
{
write-host (getDateTime) "[ACTION][FILELOCKED] $filePath is locked"
return $false
}
}
5 Réponses :
Vérifiez ce script sur PoschCode.org :
filter Test-FileLock {
if ($args[0]) {$filepath = gi $(Resolve-Path $args[0]) -Force} else {$filepath = gi $_.fullname -Force}
if ($filepath.psiscontainer) {return}
$locked = $false
trap {
Set-Variable -name locked -value $true -scope 1
continue
}
$inputStream = New-Object system.IO.StreamReader $filepath
if ($inputStream) {$inputStream.Close()}
@{$filepath = $locked}
}
FYI Ce n'est pas un lien POSHCODE.
Merci, avec l'aide du lien, j'ai créé une nouvelle fonction qui fait ce qui est requis.
@ user983965, si vous avez pu résoudre votre problème, vous devez poster la solution comme réponse à ce sujet. Les liens vers des solutions sont moins utiles car la page cible peut changer ou disparaître.
@Dourhighcharch ou être un mauvais site web
Puisque vous ne voulez pas lire le fichier, je vous recommanderais d'utiliser un utilitaire comme Sysinternals Manipul.exe, qui résoudra toutes les poignées ouvertes pour un processus. Vous pouvez télécharger HANDING.EXE à partir d'ici: P>
Création d'une fonction qui résout le problème ci-dessus:
function checkFileStatus($filePath)
{
write-host (getDateTime) "[ACTION][FILECHECK] Checking if" $filePath "is locked"
$fileInfo = New-Object System.IO.FileInfo $filePath
try
{
$fileStream = $fileInfo.Open( [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::Read )
write-host (getDateTime) "[ACTION][FILEAVAILABLE]" $filePath
return $true
}
catch
{
write-host (getDateTime) "[ACTION][FILELOCKED] $filePath is locked"
return $false
}
}
Merci beaucoup pour votre code. C'est très utile. Je l'utilise pour tester si un fichier sur un lieu de réseau partagé est disponible pour une utilisation. Tous les quelques jours, ils téléchargent un nouveau gros fichier à cet endroit (qui prend quelques heures à télécharger) et je souhaite que le téléchargement est terminé afin que je puisse copier et télécharger en toute sécurité ce fichier sur ma machine locale. Voyez-vous une faille dans mon concept?
Y a-t-il une raison pour que cela n'appelle pas $ filtream.dispose () code> avant de quitter?
@ user2426679 J'ai lu que le collectionneur des ordures s'en occupera, à moins que vous ne créez trop d'objets dans un certain délai
Cela ne fonctionne pas comme écrit pour moi, nécessaire pour remplacer $ filtream = $ fileinfo.open ([[System.io.filemode] :: Ouvrir, [System.io.FileAccess] :: Lire, [Système. Io.fileeshare] :: lu) code> avec $ filtream = $ fileinfo.open ([System.io.filemode] :: Ouvrir, [System.io.FileAccess] :: Ecrire, [System.io .FileHare] :: Lire) Code> Pour déclencher une erreur lorsque le fichier était utilisé par un autre processus.
Toutes les solutions ici reviennent faussement positives pour moi. Comme le fichier est toujours verrouillé
La fonction que j'utilise pour vérifier si un fichier est verrouillé ou non:
function IsFileLocked([string]$filePath){
Rename-Item $filePath $filePath -ErrorVariable errs -ErrorAction SilentlyContinue
return ($errs.Count -ne 0)
}
Pour mon cas, cela n'a pas fonctionné. Je souhaite copier sur un fichier existant, donc j'ai rencontré ce chèque dessus et je n'ai aucune erreur, mais quand elle est arrivée à la copie, une erreur était utilisée par le fichier par un autre processus.
function IsFileAccessible( [String] $FullFileName )
{
[Boolean] $IsAccessible = $false
try
{
Rename-Item $FullFileName $FullFileName -ErrorVariable LockError -ErrorAction Stop
$IsAccessible = $true
}
catch
{
$IsAccessible = $false
}
return $IsAccessible
}
Ajoutez quelques commentaires à votre réponse.