powershell脚本和subst命令

我有以下的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 

我想要脚本

  • find第一个未使用的驱动器号
  • 用subst创build一个新的驱动器
  • 在这个驱动器上做些事情
  • 用subst去掉驱动器

脚本运行良好,当我第一次运行它。 如果我在同一个shell中再次运行该脚本,则会从ls命令中得到一个错误,指出找不到该驱动器。 如果我打开一个新的shell并运行脚本,它再次运行良好。

我的脚本有什么问题,我怎样才能让它在同一个PowerShell实例中运行多次?

或者,也许有替代命令的替代? 我尝试使用PowerShell驱动器,但它不适用于其他Windows程序(如devenv.exe)。

我可以像你一样复制完全相同的行为,甚至在一个PowerShell窗口中,我甚至不能CD到它创建的驱动器,但如果我打开一个全新的窗口,我可以CD到它就好了。

行为似乎在这里概述:

http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/2e414f3c-98dd-4d8b-a3a3-88cfa0e7594c/

解决方法可能是使用上面提到的PSDrives,或者只是不映射,然后取消映射,然后尝试在同一个会话中重新映射相同的驱动器。

一个替代方案是使用PSProviders和更准确的PSDrives(看看获得帮助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一起使用。

我有完全相同的问题,我的解决方法 – 注意我正在使用版本3 – 是在进入新映射的驱动器之前调用Get-PSDrive

 $drive = getFreeDrive subst "$drive`:" T:\temp Get-PSDrive | Out-Null ls "$drive`:\" # just a dummy command subst "$drive`:" /D