我正在准备一个ps1文件。它将默默安装一些程序。但我的程序的安装文件保存在我的USB闪存盘中。在我的ps1文件中,
cd E:\User\User_Setups
此路径是我的USB闪存驱动器的路径。但它会在另一台机器上改变。也许G:\,F:\等 当然,我不想为每台不同的机器改变这条路径。 PowerShell如何通过命令行找到我的USB闪存驱动器的路径?
答案 0 :(得分:3)
我在我的usb Stick中添加了一个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棒的根目录中,并在棒上注册别名以便在会话中使用...
答案 1 :(得分:0)
我用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:
(它包括冒号)。
请注意,这假设设备有一个带有单个分区的磁盘。
答案 2 :(得分: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安装。遇到问题的唯一情况是使用双案例驱动器名称,然后您只需创建一个更复杂的循环。
答案 3 :(得分:0)
如果Powershell比普通的Windows CMD.exe更强大,那为什么我只需要使用命令
ECHO %~dp0
在CMD.exe中回答你的问题?在我看来,你必须编写大量额外的代码来获取批处理或cmd文件信息的相对路径,这通常出现在批处理脚本中。 Powershell失败了。
答案 4 :(得分:0)
您可以获取当前文件,并使用它来获取当前的USB驱动器。
$currentDirectory = $myInvocation.MyCommand.ScriptBlock.File | Split-Path | Get-Item
$currentDirectory.PSDrive.Root