Answers:
我对PowerShell相当陌生,因此下面的代码质量可能很差。但是,它应该获得您想要的信息:
$currentDirectory = Get-Location
$currentDrive = Split-Path -qualifier $currentDirectory.Path
$logicalDisk = Gwmi Win32_LogicalDisk -filter "DriveType = 4 AND DeviceID = '$currentDrive'"
$uncPath = $currentDirectory.Path.Replace($currentDrive, $logicalDisk.ProviderName)
$ uncPath应该包含您要查找的UNC路径。
对于任何对StExBar的RunAs脚本感兴趣的人:
param([string] $username)
$path = Get-Location
$currentDrive = Split-Path -qualifier $path
$logicalDisk = Get-WmiObject Win32_LogicalDisk -filter "DeviceID = '$currentDrive'"
if ($logicalDisk.DriveType -eq 4)
{
$path = Join-Path $logicalDisk.ProviderName (Split-Path -NoQualifier $path)
}
$systemroot = [System.Environment]::SystemDirectory
&"$systemroot\runas.exe" /user:$username "$systemroot\windowspowershell\v1.0\powershell.exe -NoExit -Command \`" &{ Set-Location '$path' }\`""
StExBar中的命令行为:
C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -Command "&{ &'%homedrive%%homepath%\RunAs.ps1' 'domain\username' }"
将路径替换为您保留RunAs.ps1脚本的位置,我希望将其存储在主文件夹的根目录中。
我意识到这是一个古老的问题,但是我想分享另一种方法来完成此任务:
$drive = Get-PSDrive -Name (get-location).Drive.Name
$root = if($drive.DisplayRoot -ne $null){$drive.DisplayRoot} else {$drive.Root}
Join-Path -Path $root -ChildPath $drive.CurrentLocation
Get-PSDrive将拉回有关驱动器的所有信息(名称,已用/可用空间,提供者,根目录和当前位置),并将Name参数作为当前驱动器号(使用get-location)传递,使它可以在多个场景中使用(这还将拉回计算机上本地驱动器上的信息)。
为了使其在本地驱动器和映射驱动器上均能正常工作,需要进行比较以在$ root中填充驱动器号或网络位置。.Root将发送回驱动器号,.DisplayRoot将拉回网络路径(如果是本地路径,则为null,这是进行比较的原因)
然后,您可以使用Join-Path合并路径,如果是本地路径,则将返回驱动器号和当前位置;如果是映射的驱动器,则将返回网络位置和当前位置。
因此,将此处的最佳答案组合成一线;测试当前路径是否为UNC,将驱动器映射到当前路径,更改为新的映射驱动器,如果已映射驱动器,则不执行任何操作。
IF ((Get-Location | %{$_.Drive}) -eq $NUL){$dltr=%{for($j=67;gdr($d=[char]++$j)2>0){}$d}; New-PSDrive –Name $dltr –PSProvider FileSystem –Root ((Get-Location).ProviderPath) –Persist; Set-Location -Path $dltr`: -PassThru}
不打算回答OP,仅添加有用的内容。有了一个脚本,我需要映射驱动器而不是UNC路径,所以我这样做是为了检查PS中是否使用了UNC,然后使用该UNC路径映射到驱动器,然后切换到该驱动器号。
$CurrentFolder = "H:\Documents"
$Query = "Select * from Win32_NetworkConnection where LocalName = '" + $CurrentFolder.Substring( 0, 2 ) + "'"
( Get-WmiObject -Query $Query ).RemoteName
$Tst = $CurrentFolder.Substring( 0, 2 )
( Get-WmiObject -Query "Select * from Win32_NetworkConnection where LocalName = '$Tst'" ).RemoteName