PowerShell脚本和subst命令

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


对我来说它运行良好,请检查第一个SUBST是否返回任何错误。如果无法挂载驱动器,则ls将失败... - Adriano Repetti
@Adriano 我没有收到任何错误。你能在一个 shell 中多次运行它吗? - guini
是的...它能够直接运行。 - Adriano Repetti
奇怪,当我运行脚本时它不起作用。但是当我手动输入subst命令时,可以多次执行而没有任何问题。感谢您的尝试。 - guini
对于“Get-FreeDrive”,您还可以使用“Get-WmiObject Win32_LogicalDisk”。 - John Oxley
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 一起使用,这是个问题。

谢谢您的建议,但我不能使用PSDrive,因为我需要在Visual Studio中使用该驱动器。 - guini
你也可以在VS中使用PowerShell。 - JPBlanc

2

我曾遇到同样的问题,我的解决方法是在进入新映射的驱动器之前调用Get-PSDrive。请注意,我使用的是版本3。

$drive = getFreeDrive

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

请注意,这在使用SUBST时非常有用(例如,防止260个字符的限制)。 - Qiau

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

这种行为似乎就像这里概述的那样:

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

解决方法可能是使用如上所述的PSDrives,或者只需不映射,然后在同一会话中尝试重新映射相同的驱动器即可。


我发现了一个错误报告,并为它投票了:https://connect.microsoft.com/PowerShell/feedback/details/719412/error-mounting-and-unmounting-using-subst-and-net-use - guini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接