6

古い BAT スクリプトを PowerShell バージョンに変換しようとしていますが、1 時間グーグル検索した後、その方法がわかりません。

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

バット:

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

パワーシェル?

4

4 に答える 4

7

ここに別の方法があります。PowerShell のイディオムであるパイプライン処理にもっと依存している点が気に入っています。

net files | 
    where   { $_.Contains( "D:\" ) } |
    foreach { $_.Split( ' ' )[0] }   |
    foreach { net file $_ /close }
于 2013-02-03T17:20:53.490 に答える
4

ネットファイルは依然として最善の策です。次のようなことを試してください:

$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

}
于 2013-02-03T13:02:17.647 に答える
3

これを使用して、開いているファイルを表示できます。

$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 }
于 2013-02-03T13:48:52.070 に答える
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
 }
}
于 2013-02-03T13:00:08.600 に答える