2013-02-26 105 views
4

我有以下的PowerShell 2.0的脚本:PowerShell脚本和subst命令

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)。

+0

它正常工作对我来说,检查第一SUBST返回任何错误。如果它无法安装驱动器,那么ls将失败... – 2013-02-26 16:00:40

+0

@Adriano我没有得到任何错误。你可以在一个shell中多次运行它吗? – guini 2013-02-26 16:26:36

+0

是的......它可以正常工作。 – 2013-02-26 16:41:18

回答

1

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

行为好像是这里概述:

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

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

+0

我发现了一个错误报告并投票支持:https://connect.microsoft.com/PowerShell/feedback/details/719412/error-mounting-and-unmounting-using-subst-and-net-use – guini 2013-02-27 08:21:55

3

一种替代是使用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" 

麻烦的是,这些驱动器不能与外壳的explorer.exe使用。

+0

感谢您的建议,但我不能使用PSDrive,因为我需要在Visual Studio中使用驱动器。 – guini 2013-02-27 08:04:11

+0

您也可以在VS中使用PowerShell。 – JPBlanc 2013-02-27 14:54:31

1

我有完全相同的问题,我的解决方法 - 请注意,我用的第3版 - 为再进新映射的驱动器调用Get-PSDrive

$drive = getFreeDrive 

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

请注意,这个实际上在你使用SUBST时有帮助(例如防止260个字符的限制)。 – Qiau 2015-08-21 08:34:14