我有以下powershell 2.0脚本:
function getFreeDrive
{
[char[]]$driveLetters = @([char]'E'..[char]'Z')
foreach ($d in $driveLetters) {
if(!(Test-Path -Path "$d`:" -IsValid)) {
return $d
}
}
}
$drive = getFreeDrive
subst "$drive`:" T:\temp
ls "$drive`:\" # just a dummy command
subst "$drive`:" /D
我想要脚本
当我第一次运行脚本时,脚本运行正常。 如果我在同一个shell中第二次运行该脚本,我会从 ls 命令中收到错误,指出无法找到该驱动器。如果我打开一个新shell并运行该脚本,它会再次正常运行。
我的脚本有什么问题,如何让它在同一个PowerShell实例中多次运行?
或许还有 subst 命令的替代品?我尝试使用PowerShell驱动器,但它不能与其他Windows程序(例如devenv.exe)一起使用。
答案 0 :(得分:4)
另一种方法是使用PSProviders,更准确地说是PSDrives(看看get-help about_providers):
PS > New-PSDrive -Name "tr" -PSProvider filesystem -Root "c:\temp"
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
tr 28,15 FileSystem C:\temp
PS > ls tr:*.c
Répertoire : C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 01/08/2012 05:28 994 test.c
PS > Remove-PSDrive -Name "tr"
问题是这些驱动器不能与shell explorer.exe一起使用。
答案 1 :(得分:2)
我遇到了完全相同的问题,我的解决方法 - 请注意我使用的是版本3 - 是在进入新映射的驱动器之前调用Get-PSDrive
:
$drive = getFreeDrive
subst "$drive`:" T:\temp
Get-PSDrive | Out-Null
ls "$drive`:\" # just a dummy command
subst "$drive`:" /D
答案 2 :(得分:1)
我可以复制与你完全相同的行为,即使在一个Powershell窗口中我甚至无法cd到它创建的驱动器这一点,但如果我打开一个全新的窗口我可以cd到它就好了。
行为似乎如下所示:
解决方法可能是如上所述使用PSDrives,或者只是不映射,然后取消映射,然后尝试在同一会话中重新映射相同的驱动器。