PowerShell - Net Use检查是否存在

时间:2016-08-01 03:42:52

标签: powershell

我正在使用Power-Shell脚本删除连接而不使用net use * /delete。在我继续放弃它之前,我能以任何方式检查连接的遥控器吗?我尝试了这个,但它没有像我想的那样工作。我接受任何建议。

$conns = net use
foreach ($con in ($conns | select Remote)) {
    if($con -eq "//MyServerB/C$") {
       net use "//MyServerB/C$" /delete
    }
}

3 个答案:

答案 0 :(得分:2)

由于net use不是PowerShell cmdlet,因此您无法获得可以使用Select-Object过滤的对象。相反,你得到的是文本。此外,我的系统上的净使用在远程路径中使用反斜杠而不是正斜杠,如果你使用双引号,你将不得不逃避美元符号,所以我只使用单引号。

所以你的代码必须如下所示:

$conns = net use
foreach ($con in $conns) {
    if($con -match '\\\\MyServerB\\C\$') {
       net use '\\MyServerB\C$' /delete
    }
}

如注释中提到的mklement0,如果远程路径未映射为驱动器号,则上述net use / delete命令仅以该格式工作。例如,如果输出如下所示:

Status       Local     Remote                    Network
-------------------------------------------------------------------------------
OK                     \\fluidfs01\c$            Microsoft Windows Network

但是如果有一个驱动器号(可能更有可能),则disconnect命令必须采用以下格式:

net use F: /delete

答案 1 :(得分:0)

我所发现的是,net use返回一个数组,因此选择一个字段并不像你写的那样工作。

$c = net use
$c[6]

我注意到你要查找的输出从数组中的第7个(数组中的6个)元素开始,并且根据返回的结果数量,它可以更高。您可以知道没有更多结果的方法是下一个元素将包含以下消息。

The command completed successfully. 

你可以循环启动元素7直到你看到那条线。然后捕捉这两者之间的情况。到目前为止,我已经能够解决这个问题了。如果我能找到更好的方法,我会更新。

答案 2 :(得分:0)

Jon Dechiro's answer包含有用的指针和基于net use的可行解决方案。

注意:以下解决方案假定相关共享已映射到驱动器号

这里有一个 主要是纯PowerShell解决方案,它利用PowerShell通过管道发送对象(PSv3 +),这是< strong>最好解析外部命令返回的 text

Get-CimInstance Win32_LogicalDisk | 
 Where-Object { $_.DriveType -eq 4 -and $_.ProviderName -eq '\\MyServerB\C$' } |
  ForEach-Object { net use $_.DeviceID /delete }
  • Get-CimInstance Win32_LogicalDisk将系统已知的所有文件系统驱动器作为[Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_LogicalDisk]个对象返回。

  • Where-Object根据以下条件过滤驱动器集合:

    • $_.DriveType -eq 4仅匹配网络(映射)驱动器。
    • $_.ProviderName -eq '\\MyServerB\C$'将驱动器的UNC共享路径与指定路径匹配;
      请注意使用单引号字符串,以确保将$视为文字。
  • ForEach-Object { net use $_.DeviceID /delete }然后只需调用net use来删除驱动器(如果管道的过滤阶段找不到感兴趣的驱动器,则不采取任何措施)。

注意:使用Remove-PSDrive删除映射驱动器的 PowerShell解决方案,如下所示 应该工作,根据文档,但是从PSv5到没有& #39; t,除非映射最初是使用New-PSDrive建立的:

Get-CimInstance Win32_LogicalDisk | 
 Where-Object { $_.DriveType -eq 4 -and $_.ProviderName -eq '\\MyServerB\C$' } |
  Remove-PSDrive

同样,我无法让Remove-SmbMapping工作。