2013-02-03 34 views
5

Tôi đang cố gắng chuyển đổi tập lệnh BAT cũ sang phiên bản PowerShell, nhưng sau một giờ googling tôi không có ý tưởng làm thế nào để làm điều đó.Làm cách nào để đóng tất cả các tệp mạng mở trong PowerShell?

Tôi đang tìm cấu trúc rất giống với cấu trúc cũ, tìm các tệp mạng mở, lấy PID của nó và đóng nó lại.

BAT:

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

PowerShell?

+2

tôi không nghĩ rằng điều này quá hẹp về phạm vi, hoặc không giúp đỡ người khác. Đóng các tệp mạng là phổ biến. Tôi chỉ cần điều tương tự. Câu hỏi này không yêu cầu một người nào đó chuyển đổi một tập tin thực thi cũ, mà là cho thấy cách nó được sử dụng để thực hiện. – Knox

+0

Tôi đồng ý, không nên đóng câu hỏi này. Đó chính xác là những gì tôi cần –

+0

Phù hợp hơn cho http://superuser.com/. –

Trả lời

1

tập Net vẫn là lựa chọn tốt nhất của bạn. Hãy thử một cái gì đó như thế này:

$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

thử điều này:

#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

Bạn có thể sử dụng để xem các tập tin mở:

$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 

Sau đó lọc những cái bạn muốn đóng:

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

Tôi thích rằng bạn đang đi cho một cách tiếp cận đối tượng phong phú, thay vì văn bản munging, nhưng trong trường hợp này nó khó sử dụng. –

+0

Yup, bạn có thể bọc nó trong một chức năng và ẩn sự phức tạp. Bằng cách này, nó có thể đã được hoàn chỉnh hơn, bộ sưu tập được sử dụng để có phương pháp loại bỏ để nó được sử dụng để có phương pháp loại bỏ nhưng nó có vẻ là mất tích. Một ưu điểm khác của việc này là tùy chọn chạy với các máy từ xa, hiện tại chỉ để lấy các tệp. –

6

Dưới đây là một cách khác. Tôi thích rằng nó dựa nhiều hơn vào pipelining, đó là thành ngữ của PowerShell:

net files | 
    where { $_.Contains("D:\") } | 
    foreach { $_.Split(' ')[0] } | 
    foreach { net file $_ /close } 
Các vấn đề liên quan