如何在PowerShell中关闭所有打开的网络文件?

时间:2013-02-03 12:29:10

标签: powershell batch-file

我正在尝试将旧的BAT脚本转换为PowerShell版本, 但在谷歌搜索一小时后,我不知道该怎么做。

我正在寻找一个与旧的结构非常相似的结构,找到开放的网络文件, 得到它的PID并关闭它。

BAT:

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

的PowerShell?

4 个答案:

答案 0 :(得分:6)

这是另一种方式。我喜欢它更依赖于流水线操作,这是PowerShell的成语:

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

答案 1 :(得分:2)

网络文件仍然是您最好的选择。尝试这样的事情:

$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

}

答案 2 :(得分: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 }

答案 3 :(得分: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
 }
}