2013-02-03 22 views
5

Sto provando a convertire il mio vecchio script BAT in versione PowerShell, ma dopo un'ora googling non ho idea di come farlo.Come chiudere tutti i file di rete aperti in PowerShell?

Sto cercando una struttura molto simile a quella precedente, trovare i file aperti in rete, ottenere il suo PID e chiuderlo.

BAT:

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

PowerShell?

+2

io non credo che questo è troppo stretta nella portata, o improbabile per aiutare gli altri. La chiusura dei file di rete è comune. Avevo solo bisogno della stessa identica cosa. Questa domanda non chiede a qualcuno di convertire un vecchio file batch, ma piuttosto di mostrare come è stato fatto. – Knox

+0

Sono d'accordo, questa domanda non dovrebbe essere chiusa. È esattamente ciò di cui ho bisogno –

+0

Più adatto per http://superuser.com/. –

risposta

1

file di rete è ancora la soluzione migliore. Provare qualcosa di simile:

$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

provare questo:

#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

È possibile utilizzare questo per visualizzare i file aperti:

$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 

quindi filtrare quelli che si desidera chiudere:

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

Mi piace il fatto che tu stia optando per un approccio ricco di oggetti, invece di munging di testo, ma in questo caso è poco pratico. –

+0

Sì, potresti avvolgerlo in una funzione e nascondere la complessità. A proposito, avrebbe potuto essere più completo, la collezione aveva il metodo Remove usato per avere il metodo Remove ma sembra che manchi. Un altro vantaggio di questo è l'opzione per l'esecuzione su macchine remote, al momento solo per ottenere i file. –

6

Ecco un altro modo. Mi piace che si basa più sui pipelining, che è l'idioma di PowerShell:

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