2013-02-03 18 views
5

Próbuję przekonwertować mój stary skrypt BAT na wersję PowerShell, , ale po godzinie googlowania nie mam pojęcia, jak to zrobić.Jak zamknąć wszystkie otwarte pliki sieciowe w PowerShell?

Szukam struktury bardzo podobnej do starej, znajdź otwarte pliki sieciowe, pobierz jej PID i zamknij.

BAT:

for /f "skip=4 tokens=1" %a in ('net files ^| findstr C:\Apps\') do net files %a /close 

PowerShell?

+2

I nie sądzę, że to jest zbyt wąski zakres, lub mało prawdopodobne, aby pomóc innym. Zamykanie plików sieciowych jest częste. Potrzebowałem dokładnie tego samego. To pytanie nie wymaga od kogoś konwersji starego pliku wsadowego, ale raczej pokazania, jak to było robić. – Knox

+0

Zgadzam się, te pytania nie powinny być zamknięte. Dokładnie tego potrzebuję. –

+0

Lepiej pasuje do http://superuser.com/. –

Odpowiedz

1

plik netto jest nadal najlepszym. Spróbuj czegoś takiego:

$results = net file | Select-String -SimpleMatch "C:\Apps\" 
foreach ($result in $results) { 
    #Get id 
    $id = $result.Line.Split(" ")[0] 

    #Close file 
    net file $id /close 

} 
0

spróbuj tego:

#capture command output 
$openfiles=net files 
#parse all lines and watch for c:\apps\ 
$openfiles| foreach { 
if($_ -like '*c:\apps\*'){ 
    #if line contains c:\apps\ split it with space, the first element will be file id 
    net files $_.split(' ')[0] /close 
} 
} 
2

Można to wykorzystać, aby zobaczyć otwarte pliki:

$adsi = [adsi]"WinNT://./LanmanServer" 

$resources = $adsi.psbase.Invoke("resources") | Foreach-Object { 
    New-Object PSObject -Property @{ 
     ID = $_.gettype().invokeMember("Name","GetProperty",$null,$_,$null) 
     Path = $_.gettype().invokeMember("Path","GetProperty",$null,$_,$null) 
     OpenedBy = $_.gettype().invokeMember("User","GetProperty",$null,$_,$null) 
     LockCount = $_.gettype().invokeMember("LockCount","GetProperty",$null,$_,$null) 
    } 
} 

$resources 

Następnie filtrować te, które chcesz, aby zamknąć:

$resources | Where-Object { $_.Path -like 'c:\apps\*'} | 
Foreach-Object { net files $_.ID /close } 
+0

Podoba mi się, że zamierzasz zastosować podejście bogate w obiekt, zamiast zmieszania tekstu, ale w tym przypadku jest ono nieporęczne. –

+0

Tak, możesz zawinąć go w funkcję i ukryć złożoność. By the way, mógł on być bardziej kompletny, w kolekcji użyto metody Remove do użycia metody Remove, ale wydaje się, że jej brakuje. Kolejną zaletą jest możliwość uruchamiania na zdalnych komputerach, obecnie tylko po to, aby uzyskać pliki. –

6

Oto kolejny sposób. Lubię to, że opiera się bardziej na potoku, który jest idiom PowerShell:

net files | 
    where { $_.Contains("D:\") } | 
    foreach { $_.Split(' ')[0] } | 
    foreach { net file $_ /close } 
Powiązane problemy