Как найти путь к моей флешке с помощью PowerShell - PullRequest
0 голосов
/ 14 марта 2012

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

cd E:\User\User_Setups

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

Ответы [ 5 ]

3 голосов
/ 14 марта 2012

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

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

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

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

0 голосов
/ 24 сентября 2013

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

$currentDirectory = $myInvocation.MyCommand.ScriptBlock.File | Split-Path | Get-Item
$currentDirectory.PSDrive.Root
0 голосов
/ 24 сентября 2013

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

ECHO %~dp0

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

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

0 голосов
/ 14 марта 2012

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

0 голосов
/ 14 марта 2012

Я сделал это с помощью 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: (оно включает двоеточие).* Обратите внимание, что предполагается, что устройство имеет один диск с одним разделом.

...