2012-03-14 6 views
0

ps1ファイルを準備しています。サイレントにいくつかのプログラムをインストールします。しかし、私のプログラムのセットアップファイルは私のUSBフラッシュドライブに保存されていました。私のps1ファイルでは、PowerShellでUSBフラッシュドライブのパスを見つける方法

cd E:\User\User_Setups 

このパスは私のUSBフラッシュドライブのパスです。しかし、それは他のマシン上で変更されます。たぶんG:\、F:\など 当然、私はこのマシンごとにこのパスを変更したくありません。 PowerShellは、コマンドラインでUSBフラッシュドライブのパスを見つける方法を教えてください。

答えて

3

私は私のUSBスティックにVolumeLabel( "MyToolBox")を追加し、profile.ps1に次の行を置く:

のGet-DriveInfoはモジュールPscxから来
Get-DriveInfo | % { if($_.VolumeLabel -eq "MyToolBox"){ Set-Location $_.Name; ./Startup.ps1}} 

:あなたはこれをインポートする必要がhttp://pscx.codeplex.com/ あなたの中に...あまりにプロフィール私はWMIでこれをやった

+0

「MyToolBox」とは何ですか? :S – cethint

+0

MyToolBoxは、フラッシュドライブのボリュームラベルです。 MyToolBoxではなく、新しいラベルを探すようにスクリプトを調整することができます。 – Goyuix

+0

「Get-DriveInfo」という用語は、コマンドレット、関数、スクリプトファイル e、または実行可能なプログラムの名前として認識されません。名前の綴りを確認するか、パスが含まれている場合は、パスが正しいことを確認してからもう一度試してください。 G:\ startup.ps1:1 char:14 + Get-DriveInfo <<<< | %{if($ _。VolumeLabel -eq "MyToolBox"){Set-Location $ _。Name; 。 /startup.ps1}} + CategoryInfo:ObjectNotFound:(取得-DriveInfoを:文字列)[]、CommandNotFoun dException + FullyQualifiedErrorId:CommandNotFoundException がどのように私はこのエラーを修正することができますか? – cethint

0

Startup.ps1スクリプトは私のUSBスティックのルートにあり、セッションで使用するためのスティックにエイリアスを登録します...:デバイスの種類を使用してドライブ文字を取得します。 (実際のスクリプトにはロギングとエラー処理があります)。私が最初にWin32_PnpEntityと、デバイスマネージャから$deviceCaptionを得た:最後の式は、ドライブ名を返す

$objs = @(Get-WmiObject -Query "select Caption,__RELPATH from Win32_PnpEntity where caption=""$deviceCaption""") 
    if ($objs.Length -eq 0) { 
     throw "MP3 Player is not connected" 
    } elseif ($objs.Length -gt 1) { 
     throw "Seem to be multiple MP3 players connected" 
    } 
    $relPath = $objs[0]; 

    $objs = @(Get-WmiObject -Query "ASSOCIATORS OF {$relPath} where resultclass=Win32_DiskDrive") 
    $relPath = $objs[0].__RelPath; 

    $objs = @(Get-WmiObject -Query "ASSOCIATORS OF {$relPath} where resultclass=Win32_DiskPartition") 
    $relPath = $objs[0].__RelPath; 
    $objs = @(Get-WmiObject -Query "ASSOCIATORS OF {$relPath} where resultclass=Win32_LogicalDisk") 
    $relPath = $objs[0].__RelPath; 
    Write-Debug "RelPath #4: $($objs[0].__RelPath), drive: $($objs[0].DeviceID)" 

    $objs[0].DeviceID 

こと、のようなもの:Q:は、(それが結腸に含まれません)。

ここでは、デバイスに単一パーティションの単一のディスクがあることを前提としています。

0

おそらくいくつかの方法があります。個人的には、idファイルdisk.idをドライブに置いて、探しているIDのidファイルが見つかるまで、各ドライブをプログラムで検索します。このような何か:

#Start i at 65 to represent A 
i=65 
do { 
    $idFile = Get-Content [char]$i:\disk.id -totalcount 1 
    if($idFile -eq "MyIdDrive") { #whatever your first line in the id file may be 
     Write-Host "[char]$i is my drive!" 
    } 
    $i++ 
} 
while ($i -le 65+26) 

それは強引な方法だと、あなたが取得する - コンテンツを扱うエラーする必要があるかもしれませんが、それはWindowsがインストールほとんどで動作するはずです。あなたが問題に遭遇する唯一のケースは、ドライブ名が二重の場合です。より洗練されたループを作成する必要があります。

1

PowerShellはCMD.EXEは、なぜ私はあなたの質問に答えるために、コマンドにcmd.exeの中

ECHO %~dp0 

を使用する必要がない通常のWindowsよりも強力ですか?バッチスクリプトやcmdファイル情報の相対パスを取得するために、たくさんの余分なコードを書く必要があります。これはバッチスクリプトで頻繁に発生します。 Powershellは失敗します。

http://ss64.com/nt/syntax-args.html詳細については、

0

現在のファイルを取得し、これを使用して現在のUSBドライブを取得することができます。

$currentDirectory = $myInvocation.MyCommand.ScriptBlock.File | Split-Path | Get-Item 
$currentDirectory.PSDrive.Root 
関連する問題