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でドライブを削除します

初めてスクリプトを実行すると、スクリプトは正常に動作します。同じシェルでスクリプトをもう一度実行すると、lsコマンドから、ドライブが見つからないというエラーが表示されます。新しいシェルを開いてスクリプトを実行すると、再び正常に実行されます。

私のスクリプトの問題は何ですか? 同じ PowerShell インスタンスでスクリプトを複数回実行するにはどうすればよいですか?

あるいは、substコマンドの代わりになるものはありますか? PowerShell ドライブを使用してみましたが、他の Windows プログラム (devenv.exe など) では動作しません。

4

3 に答える 3

4

別の方法は、PSProviderとより正確なPSDriveを使用することです(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で使用できないことです。

于 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

私はあなたとまったく同じ動作を再現できます.1つのPowershellウィンドウで、作成されたドライブにcdすることさえできませんが、新しいウィンドウを開くと、問題なくcdできます.

動作は、次のように概説されているようです。

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

回避策は、おそらく上記のように PSDrive を使用するか、マップせずにマップを解除してから、同じセッションで同じドライブを再マップすることです。

于 2013-02-26T22:09:11.803 に答える