0

Использование POSH на сервере Windows (2012) Я пытаюсь выборочно закрыть любые файлы, которые открыты на некоторых поддиректорах; скажем ничего с E: \ DIR1 \ source *. *.Net file output обрезает длинные пути файла

Структура папки верхнего уровня:

E:\ 
    DIR0 
    DIR1 
     source 
      bob 
      mike 
     archive 
      Week 
      Weekend 

Так это значит, что я хочу, чтобы закрыть соединение с любыми файлами в

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

код, который я есть звонки «чистый файл» (нет параметров), чтобы получить список всех открытых подключений и работает с его результатом, чтобы создать массив из семи элементов, который выглядит следующим образом:

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  

Затем код разбивает каждую строку на четыре столбца (FileID, Path, User, NumLocks). Наконец, он сравнивает свойство пути каждого элемента из «чистого файла» с набором путей, которые меня интересуют Так в то время как цикл через массив элементов, (псевдо-код):.

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

Вот проблема: если путь к файлу слишком длинный, то команда «net file» усекает вывод, вставив «...» в путь к файлу (см. идентификаторы файлов 228, 167, 120). Я не знаю полного расположения идентификаторов файлов 228 или 167: они находятся где-то в DIR1, но находятся ли они в одной из трех интересующих папок или нет?

Итак, есть:

  1. Любой способ заставить «чистый файл», чтобы получить вверх полный путь
  2. альтернативной утилиту для «чистого файл», который возвращает полный путь и ID
  3. POSH для достижения одинакового результата, например идентификатор и полный путь к любому открытому файлу

С # 2 & 3, я также нужен идентификатор файла, так что я могу закрыть соединение с «чистого файла» (если нет альтернативы, что также).

+1

Get-SmbOpenFile - эквивалент powershell. –

+0

Это хороший кандидат на обман: http: // stackoverflow.com/questions/34885837/check-who-has-a-excel-file-open-in-powershell – Matt

+0

@Tav - эта функция была крючком в решении, к которому я пришел - спасибо – NeepNeepNeep

ответ

1

Благодаря предложению Tav о Get-SmbOpenFile, я прибыл в этот трубопровод тэстик решение:

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

Это все, что нужно это сделать:

  1. Возвращает все открытые файлы как объекты
  2. Фильтры объектов на длину пути не менее $ topPath
  3. Фильтрует объекты на первых х символах, равных $ topPath
  4. Выбирает идентификаторы файлов
  5. Трубы этих файловых идентификаторов для Close-SmbOpenFile, причем -Force отменяет любое предупреждение.

Надеюсь, это поможет кому-то еще!

+1

. Ответы не требуются. Он будет работать без них. – Matt

+0

Чисто для упрощения чтения – NeepNeepNeep

+2

Вы можете оставить новые строки и отступы .... Просто удалите обратные метки. Я кодирую то же самое. – Matt