Как найти путь к моей флешке с помощью 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