我正在使用Power-Shell脚本删除连接而不使用net use * /delete
。在我继续放弃它之前,我能以任何方式检查连接的遥控器吗?我尝试了这个,但它没有像我想的那样工作。我接受任何建议。
$conns = net use
foreach ($con in ($conns | select Remote)) {
if($con -eq "//MyServerB/C$") {
net use "//MyServerB/C$" /delete
}
}
答案 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
工作。