Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 检查共享驱动器是否已映射_Powershell - Fatal编程技术网

Powershell 检查共享驱动器是否已映射

Powershell 检查共享驱动器是否已映射,powershell,Powershell,我第一次使用PowerShell来检查unc路径是否已映射,如果已映射,则删除它以在特定凭据下再次创建它 我发现的问题是,如果路径存在于网络使用列表中,但有一个驱动器号,则必须按驱动器号删除它,驱动器号当然是随机的。因此,我需要找出驱动器号时,我匹配它,但我不知道如何 $userPass = '/user:Domain\User password'; $ltr = ls function:[d-z]: -n | ?{ !(test-path $_) } | random; $share = '\

我第一次使用PowerShell来检查unc路径是否已映射,如果已映射,则删除它以在特定凭据下再次创建它

我发现的问题是,如果路径存在于网络使用列表中,但有一个驱动器号,则必须按驱动器号删除它,驱动器号当然是随机的。因此,我需要找出驱动器号时,我匹配它,但我不知道如何

$userPass = '/user:Domain\User password';
$ltr = ls function:[d-z]: -n | ?{ !(test-path $_) } | random;
$share = '\\\\server\\folder';
$newMap = 'net use '+ $ltr + ' '$share + ' '$userPass;
foreach ($con in net use) {
    if ($con -match $share) {
        $MappedLetter = /*something here to find the matched drive?*/
        if ($MappedLetter) {
            net use $MappedLetter /delete
        } else {
            net use $share /delete
        }
    }
};

net use $newMap;

[编辑]


我尝试了
获取PSDrive
,但这仅在UNC路径映射到驱动器时有效。由于这些有时可能是“僵尸”,即存在于
网络使用中
,但没有字母,因此这种方法并不总是有效。我可以将这两种方法结合起来(上面是一个
获取PSDrive
),但是如果有人有更干净的方法,请告诉我

您应该能够通过以下方式检查特定共享是否已映射:

如果您只想在映射驱动器时移除驱动器,可以执行以下操作:

Get-PSDrive | Where-Object {
    $_.DisplayRoot -eq $share
} | Remove-PSDrive

更新:

AFAIK PowerShell无法直接枚举和删除断开连接的驱动器。您可以从注册表中获取该信息:

$share = '\\server\share'
$drive = Get-ItemProperty 'HKCU:Network\*' |
         Where-Object { $_.RemotePath -eq $share } |
         Select-Object -Expand PSChildName
$share = '\\server\share'
Get-ItemProperty 'HKCU:Network\*' |
    Where-Object { $_.RemotePath -eq $share } |
    Remove-Item

# also remove mount point in Windows Explorer
$key = 'Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2'
$subkey = Join-Path $key ($share -replace '\\', '#')
Get-ItemProperty "HKCU:${subkey}" | Remove-Item
或者从
网络使用
输出中解析它:

net use | Where-Object {
    $_ -match '(?<=^Unavailable\s+)\w:'
} | ForEach-Object {
    $matches[0]
}

我建议使用
Get WMIObject Win32\u LogicalDisk
而不是
net use
。然后你将在一个对象中拥有驱动器和共享信息。你能为我扩展一下吗?这是我第一次使用powershell
Root
仅仅是列标题,使用
DisplayRoot
作为不动产名称,它不需要包含在{script block}
$drive=(Get-PSDrive | Where-Object DisplayRoot-eq$share)中。name
谢谢,如果你想回答这个问题,我会标记出来。现在一切正常我使用
Remove-PSDrive
cmdlet取消映射驱动器的结果好坏参半,我仍然需要
net-use/DELETE
来摆脱僵尸连接。@RobboLew括号中的()表示形式。名称相当于Select。对于第二个脚本,请尝试
获取PSDrive |?DisplayRoot-eq$share |删除PSDrive
um。。。对这就是你说的你的问题所在。尝试通过
net use
删除映射驱动器时,需要指定指定的驱动器号。因此,我认为可以安全地假设实际上有一个指定的驱动器号。
$share = '\\server\share'
Get-ItemProperty 'HKCU:Network\*' |
    Where-Object { $_.RemotePath -eq $share } |
    Remove-Item

# also remove mount point in Windows Explorer
$key = 'Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2'
$subkey = Join-Path $key ($share -replace '\\', '#')
Get-ItemProperty "HKCU:${subkey}" | Remove-Item