0

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

cd E:\User\User_Setups

このパスは、私の USB フラッシュ ドライブのパスです。ただし、他のマシンでは変更されます。おそらく G:\、F:\ などです。もちろん、マシンごとにこのパスを変更したくはありません。PowerShell がコマンドラインで USB フラッシュ ドライブのパスを見つける方法は?

4

5 に答える 5

3

USB スティックに VolumeLabel("MyToolBox") を追加し、profile.ps1 に次の行を追加しました。

Get-DriveInfo | % { if( $_.VolumeLabel -eq "MyToolBox"){ Set-Location $_.Name; ./Startup.ps1}}

Get-DriveInfo は、モジュール Pscx から取得されます: http://pscx.codeplex.com/ これもプロファイルにインポートする必要があります...

Startup.ps1 スクリプトは USB スティックのルートにあり、セッションで使用するためにスティックにエイリアスを登録します...

于 2012-03-14T14:58:30.783 に答える
1

私はこれを WMI で行いました。デバイス タイプを使用してドライブ文字を取得しました。簡略化された形式 (実際のスクリプトにはログ記録とエラー処理があります)。最初にデバイスマネージャー$deviceCaptionから取得しました:Win32_PnpEntity

    $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:(コロンまで含まれます)。

これは、デバイスに単一のパーティションを持つ単一のディスクがあることを前提としていることに注意してください。

于 2012-03-14T15:10:45.623 に答える
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)

これは強引な方法であり、Get-Content のエラー処理が必要になる場合がありますが、ほとんどの Windows インストールで機能するはずです。問題が発生する唯一のケースは、大文字と小文字のドライブ名が 2 つある場合です。その場合は、より洗練されたループを作成する必要があります。

于 2012-03-14T15:11:55.733 に答える