PowerShell中实现驱动器号映射检查与非匹配替换及Get-DriveMap函数的实现方法
解决PowerShell驱动器映射检查与替换的问题
首先咱们先搞定Get-DriveMap的报错问题——原来的Get-PSDrive在目标驱动器号不存在时会直接抛出终止错误,这可不是咱们想要的效果,得让它找不到驱动器时安静返回$null。
修正后的Get-DriveMap函数
function Get-DriveMap { param( [string]$letter ) # 用-ErrorAction抑制找不到驱动器时的报错,返回$null $drive = Get-PSDrive -Name $letter.TrimEnd(':') -ErrorAction SilentlyContinue # 链式判断:找到驱动器就返回映射路径,否则返回$null return $drive?.DisplayRoot }
这里做了两个实用优化:
- 加上
-ErrorAction SilentlyContinue,让命令在找不到驱动器时不报错,直接返回空值 - 对输入的驱动器号做
TrimEnd(':')处理,不管用户传的是Z:还是Z都能正常识别
修正并完善Set-MapDrive函数
原来的代码里还有几个小坑:参数名拼写错了($shar_path应该是$share_path)、变量名误用($user_path其实是$curr_path)、哈希比较逻辑搞反了,还有net use的删除命令格式不对。更重要的是——根本不需要先删除再重新映射!net use支持直接用新路径覆盖现有映射,完全不会中断正在使用该驱动器的进程,正好符合你的需求。
下面是修正后的完整版本:
function Set-MapDrive { param( [string]$letter, [string]$share_path ) $curr_path = Get-DriveMap -letter $letter # 驱动器未映射,直接创建新映射 if ($curr_path -eq $null) { Write-Host "Mapping drive $letter to $share_path..." net use $letter $share_path } else { # 统一路径格式,避免\\和//的差异导致误判 $normalizedCurr = $curr_path.Replace('\\', '//').TrimEnd('/') $normalizedTarget = $share_path.Replace('\\', '//').TrimEnd('/') # 当前映射路径和目标不一致时,直接覆盖替换 if ($normalizedCurr -ne $normalizedTarget) { Write-Host "Drive $letter is mapped to $curr_path. Updating to $share_path..." # 可选:加/persistent:no保持临时映射,重启后消失;改成yes则保留持久映射 net use $letter $share_path /persistent:no } else { Write-Host "Note: Drive $letter is already mapped to $share_path" } } }
测试调用
完全按照你预期的方式执行就行:
Set-MapDrive "Z:" "//MyServer/Stuff1"
内容的提问来源于stack exchange,提问作者pico




