PowerShell でローカル パスから現在の UNC パスを取得する

PowerShell でローカル パスから現在の UNC パスを取得する

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

したがって、ここでの最良の回答を 1 行にまとめると、現在のパスが 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 パスを使用してドライブにマップし、そのドライブ文字に切り替えるためにこれを行いました。

関連情報