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


10

マッピングされたドライブがPowerShellにあり、PowerShell内にあると仮定M:\する\\SomeServer\SomeShareと、それをM:\SomeFolderUNCパスに変換するにはどうすればよいですか\\SomeServer\SomeShare\SomeFolder


スタックオーバーフローにする必要がありますか?
spoon16

回答:


14

私は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 + powershellに関する厄介な問題が修正されます。
Chris Chilvers、

@firedfly、ローカルドライブ(例: `C:`)をサポートするためにこれをどのように変更する必要がありますか?おそらくマシン名を含める必要がありますが、HDDドライブとCD / DVDドライブをどのように区別するかはわかりません。
クレイグ

4

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

私はこれが古い質問であることを知っていますが、誰かがこれの1行のバージョンを必要とする場合に備えて:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName

これは、実際にドライブにマップされたネットワークパス上にいる場合にのみ機能することに注意してください。ローカルパス上にいる場合、ProviderNameはnullです。ドライブにマップされていないネットワークパスを使用している場合、ドライブはnullです。これら3つのケースを区別する必要がある場合、ワンライナーはそれをカットしません。
Timbo 2013

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を使用すると、パスをまとめることができます。これにより、ローカルパスの場合はドライブ文字と現在の場所、マップされたドライブの場合は現在の場所が返されます。


仕組みを説明してください。
アダム

1
説明を追加しました-ご連絡いただきありがとうございます。
ライアン

1
SharePointを使用している場合の情報と同じです。New-PSDriveコマンドレットを使用して、ドライブをSharePointドキュメントライブラリにマップしました。この場合、Nameプロパティにドライブ文字があり、RootプロパティにはUNCパスが含まれており、DisplayRootプロパティは空です。
ホルパー

0

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


-2
$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

1
このコードが何をするかについて詳しく説明しましたか?回答方法をご覧になり、ツアーに参加してください
ブルギ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.