0

Utilisation de POSH sur un serveur Windows (2012) J'essaie de fermer de manière sélective tous les fichiers ouverts sur certains sous-répertoires; disons n'importe quoi avec E: \ DIR1 \ source *. *.La sortie de fichier Net tronque les longs chemins de fichier

La structure de dossier de niveau supérieur est:

E:\ 
    DIR0 
    DIR1 
     source 
      bob 
      mike 
     archive 
      Week 
      Weekend 

Cela veut donc dire que je veux fermer les connexions à tous les fichiers dans

E:\DIR1\source\ 
E:\DIR1\source\bob 
E:\DIR1\source\mike 

Le code je appelle « fichier net » (pas de paramètres) pour obtenir une liste de toutes les connexions ouvertes et travaille avec sa sortie pour créer un tableau de sept éléments qui ressemble à ceci:

194 E:\DIR0\        user1    0  
228 E:\DIR1\...\myFile.csv     user2    0  
227 E:\DIR1\source\files\     user1    0  
167 E:\DIR1\...        user1    0  
181 E:\          user3    0  
241 E:\          user1    0  
120 E:\DIR3\...        user4    0  

Le code divise ensuite chaque ligne en quatre colonnes (FileID, Path, User, NumLocks). Enfin, il compare la propriété de chemin de chaque élément de « fichier net » avec la collection de chemins que je suis intéressé par Ainsi, alors une boucle à travers le tableau des éléments, (pseudo-code).

foreach ($netFileOutputItem in $netFileOutput) { 
    if ($netFileOutputItem.Path -in $arrayOfSubDirs) { 
     net file $netFileOutputItem.FileID /close 
    } 
} 

Voilà le problème: si le chemin du fichier est trop long, la commande "net file" tronque la sortie, en insérant "..." dans le chemin du fichier (voir les ID de fichier 228, 167, 120). Je ne connais pas l'emplacement complet des ID de fichier 228 ou 167: ils se trouvent quelque part dans DIR1, mais sont-ils dans l'un des trois dossiers d'intérêt ou non?

Alors, est-il:

  1. Une manière de forcer "net file" pour obtenir un chemin complet
  2. Un utilitaire alternative au "fichier net" qui retourne le chemin complet et ID
  3. Code POSH pour atteindre la même sortie, par exemple l'ID et le chemin complet à tout fichier ouvert

AveC# 2 & 3, je voudrais aussi besoin de l'ID de fichier afin que je puisse arrêter la connexion avec « fichier net » (sauf quand il y a une alternative à ainsi que).

+1

Get-SmbOpenFile est l'équivalent de PowerShell. –

+0

Ceci est un bon candidat pour un dupe: http: // stackoverflow.com/questions/34885837/vérification-qui-a-un-excel-fichier-open-in-powershell – Matt

+0

@Tav - cette fonction a été le point d'ancrage dans la solution, je suis arrivé à - merci – NeepNeepNeep

Répondre

1

Merci à la suggestion de Tav de Get-SmbOpenFile, je suis arrivé à cette solution de pipeline tastic:

$topPath = 'E:\DIR1\source\' 
Get-SmbOpenFile | ` 
    ? { $_.Path.Length -ge $topPath.Length} | ` 
    ? { $_.Path.Substring(0, $topPath.Length) -eq $topPath} | ` 
    select fileID | ` 
    Close-SmbOpenFile -Force 

Ce tout ce que je devais ne faire:

  1. Retours tous les fichiers ouverts comme des objets
  2. Filtre les objets sur la longueur du chemin au moins égale à $ topPath
  3. Filtre les objets sur les premiers caractères x étant égal à $ topPath
  4. Sélectionne les FileID
  5. Pipe ces FileID vers Close-SmbOpenFile, avec -Force écrasant tout avertissement.

Espérons que cela aide quelqu'un d'autre!

+1

Ces dos ne sont pas obligatoires. Cela fonctionnera sans eux. – Matt

+0

Simplement pour faciliter la lecture – NeepNeepNeep

+2

Vous pouvez laisser les nouvelles lignes et les retraits .... Il suffit de retirer les accolades. Je code de la même manière. – Matt