4

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

我希望脚本

  • 找到第一个未使用的驱动器号
  • 使用 subst 创建一个新驱动器
  • 在这个驱动器上做点什么
  • 用 subst 卸下驱动器

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

我的脚本有什么问题,如何让它在同一个 powershell 实例中运行多次?

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

4

3 回答 3

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 一起使用。

于 2013-02-26T20:21:45.643 回答
2

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

$drive = getFreeDrive

subst "$drive`:" T:\temp 
Get-PSDrive | Out-Null
ls "$drive`:\"  # just a dummy command 
subst "$drive`:" /D
于 2015-03-10T16:07:29.960 回答
1

我可以复制与您完全相同的行为,甚至在一个 Powershell 窗口中我什至无法 cd 到它创建的驱动器,但如果我打开一个全新的窗口,我可以 cd 到它就好了。

行为看起来像这里概述的那样:

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

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

于 2013-02-26T22:09:11.803 回答