我試圖將我的舊BAT腳本轉換爲PowerShell版本, 但一小時後Google搜索我不知道該怎麼做。如何在PowerShell中關閉所有打開的網絡文件?
我正在尋找一個非常類似於舊的結構,找到打開的網絡文件, 得到它的PID並關閉它。
BAT:
for /f "skip=4 tokens=1" %a in ('net files ^| findstr C:\Apps\') do net files %a /close
PowerShell的?
我試圖將我的舊BAT腳本轉換爲PowerShell版本, 但一小時後Google搜索我不知道該怎麼做。如何在PowerShell中關閉所有打開的網絡文件?
我正在尋找一個非常類似於舊的結構,找到打開的網絡文件, 得到它的PID並關閉它。
BAT:
for /f "skip=4 tokens=1" %a in ('net files ^| findstr C:\Apps\') do net files %a /close
PowerShell的?
淨文件仍然是你最好的選擇。嘗試是這樣的:
$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
}
試試這個:
#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
}
}
你可以用它來查看打開文件:
$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
然後過濾要關閉的那些:
$resources | Where-Object { $_.Path -like 'c:\apps\*'} |
Foreach-Object { net files $_.ID /close }
我喜歡你要採用物體豐富的方法,而不是文本消除,但在這種情況下,它很笨拙。 –
是的,你可以將它包裝在一個函數中,並隱藏複雜性。順便說一下,它可能已經更完整了,過去曾使用Remove方法的集合具有Remove方法,但它似乎缺少。這樣做的另一個優點是可以運行在遠程計算機上,目前僅用於獲取文件。 –
這裏的另一種方式。我喜歡它更依賴流水線,這是PowerShell的成語:
net files |
where { $_.Contains("D:\") } |
foreach { $_.Split(' ')[0] } |
foreach { net file $_ /close }
我不認爲這個範圍太窄,或者不太可能幫助別人。關閉網絡文件很常見。我只需要相同的東西。這個問題不是要求某人轉換一箇舊的批處理文件,而是要顯示它是如何完成的。 – Knox
我同意,這個問題不應該被關閉。這正是我需要的 –
更適合http://superuser.com/。 –