Как найти путь к моей флешке с помощью PowerShell

Я готовлю файл PS1. Он установит некоторые программы в автоматическом режиме. Но установочные файлы моих программ были сохранены на моей флешке. В моем файле PS1,

cd E:\User\User_Setups

Этот путь - путь моего USB-накопителя. Но это изменится на другой машине. Может быть, G:\, F:\ и т. Д. Естественно, я не хочу менять этот путь для разных машин. Как PowerShell находит путь к моей флешке через командную строку?

5 ответов

Решение

Я добавил VolumeLabel("MyToolBox") на мою флешку и вставил следующую строку в profile.ps1:

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

Get-DriveInfo поставляется из модуля Pscx: http://pscx.codeplex.com/ Вам также необходимо импортировать это в свой профиль...

Скрипт Startup.ps1 находится в корне моей флешки и регистрирует псевдонимы на флешке для использования в сеансе...

Я сделал это с 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: (это относится к двоеточию).

Обратите внимание, это предполагает, что устройство имеет один диск с одним разделом.

Если Powershell является более мощным, чем обычный Windows CMD.exe, то почему я должен использовать только команду

ECHO %~dp0

в CMD.exe ответить на ваш вопрос? Мне кажется, вам нужно написать много дополнительного кода, чтобы получить относительный путь к информации о пакетном или cmd-файле, и это часто встречается в пакетных сценариях. Powershell не удастся.

http://ss64.com/nt/syntax-args.html для получения дополнительной информации.

Есть, вероятно, несколько хороших способов сделать это. Лично я помещал на диск файл идентификатора disk.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. Единственный случай, когда вы столкнетесь с проблемами - это имена дисков с двойным регистром, а затем вам просто нужно будет создать более сложный цикл.

Вы можете получить текущий файл и использовать его для получения текущего usb-диска.

$currentDirectory = $myInvocation.MyCommand.ScriptBlock.File | Split-Path | Get-Item
$currentDirectory.PSDrive.Root
Другие вопросы по тегам