2013-02-03 12 views
5

私は古いBATスクリプトをPowerShellのバージョン に変換しようとしていますが、1時間のグーグルではどうしたらいいか分かりません。PowerShellで開いているネットワークファイルをすべて閉じるにはどうすればいいですか?

私は古いものに非常によく似た構造を探しています。開いているネットファイルを見つけて PIDを取得して閉じます。

BAT:

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

PowerShellの?

+2

:私はそれをPowerShellののイディオムである、パイプライン上でより依存していることを好みます。ネットワークファイルを閉じるのが一般的です。私はちょうど同じ正確なものが必要でした。この質問は、誰かが古いバッチファイルを変換することを要求するのではなく、以前のバッチファイルの変換方法を示しています。 – Knox

+0

私は同意する、この質問は閉じてはならない。それは私が必要としているものです。 –

+0

http://superuser.com/に適しています。 –

答えて

1

ネットファイルには、まだあなたの最善の策です。

$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

はこれを試してみてください。

#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

あなたが開いているファイルを表示するためにこれを使用することができます:

$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 } 
+0

私はあなたがテキストに替わるのではなく、オブジェクトに富んだアプローチをしているのが好きですが、この場合は扱いにくいです。 –

+0

うん、それを関数にラップして複雑さを隠すことができます。ちなみに、それはより完全だった可能性がありますが、コレクションにRemoveメソッドを使用していましたが、Removeメソッドを使用していましたが、欠落しているようです。これのもう一つの利点は、リモートマシンに対して実行するオプションで、現在はファイルを取得するだけです。 –

6

ここでは別の方法です。このような何かを試してみてください。私は、これはあまりにも範囲が狭い、または他人を助けることはほとんどありませんとは思わない

net files | 
    where { $_.Contains("D:\") } | 
    foreach { $_.Split(' ')[0] } | 
    foreach { net file $_ /close } 
関連する問題