假設我有一個映射驅動器M:\
並\\SomeServer\SomeShare
在 powershell 中,我位於資料夾中,M:\SomeFolder
如何將其轉換為 UNC 路徑,即\\SomeServer\SomeShare\SomeFolder
.
答案1
我對 PowerShell 相當陌生,因此下面的程式碼品質可能很差。但是,它應該獲得您想要的資訊:
$currentDirectory = Get-Location
$currentDrive = Split-Path -qualifier $currentDirectory.Path
# Mapping a non-network drive? Check the DriveType enum documentation https://docs.microsoft.com/en-us/dotnet/api/system.io.drivetype?view=net-6.0
$logicalDisk = Get-CimInstance -ClassName Win32_LogicalDisk -filter "DriveType = 4 AND DeviceID = '$currentDrive'"
$uncPath = $currentDirectory.Path.Replace($currentDrive, $logicalDisk.ProviderName)
$uncPath 應包含您要尋找的 UNC 路徑。
答案2
對於任何對 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 腳本的位置,我喜歡將其儲存在我的主資料夾的根目錄中。
答案3
我意識到這是一個老問題,但我想分享另一種方法來完成這個任務:
$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,您可以將路徑組合在一起,如果是本機路徑,則返回驅動器號和當前位置;如果是映射驅動器,則返回網路路徑和當前位置。
答案4
因此,將這裡最好的答案合併成一句話;將目前路徑測試為 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 路徑的驅動器,然後切換到該驅動器號。