Ottieni il percorso UNC corrente da un percorso locale in PowerShell


10

Supponendo che ho un disco mappato M:\su \\SomeServer\SomeSharee in PowerShell sono nella cartella M:\SomeFoldercome posso convertirlo in un percorso UNC, cioè \\SomeServer\SomeShare\SomeFolder.


dovrebbe essere su StackOverflow?
spoon16,

Risposte:


14

Sono abbastanza nuovo su PowerShell, quindi il codice seguente potrebbe essere di scarsa qualità. Tuttavia, dovrebbe ottenere le informazioni desiderate:

$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 dovrebbe contenere il percorso UNC che stai cercando.


Grazie mille, funziona perfettamente. L'ho modificato leggermente per funzionare anche con percorsi locali, questo dovrebbe risolvere i miei fastidiosi problemi con StExBar + runas + powershell su un'unità mappata.
Chris Chilvers,

@firedfly, come dovrebbe essere modificato per supportare le unità locali (es. `C:`)? Probabilmente avrebbe bisogno di includere il nome della macchina, ma non so come si possa distinguere tra un HDD e un'unità CD / DVD.
Craig,

4

Per chiunque sia interessato allo script RunAs per StExBar è:

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' }\`""

E la riga di comando in StExBar è:

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -Command "&{ &'%homedrive%%homepath%\RunAs.ps1' 'domain\username' }"

Sostituisci il percorso con il punto in cui mantieni lo script RunAs.ps1, mi piace archiviare il mio nella cartella principale della mia home.


3

So che questa è una vecchia domanda, ma nel caso in cui qualcuno abbia bisogno della versione a una riga di questo:

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

Nota che funziona solo se sei effettivamente su un percorso di rete mappato sull'unità. Se sei su un percorso locale, ProviderName è null; se ti trovi su un percorso di rete non mappato sull'unità, Drive è nullo. Se è necessario distinguere tra questi 3 casi, un liner non lo taglierà.
Timbo,

3

Mi rendo conto che questa è una vecchia domanda, ma volevo condividere un altro modo per farlo:

$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 ritirerà tutte le informazioni su un'unità (nome, spazio usato / libero, provider, root e posizione corrente) e passando il parametro Name come la lettera di unità corrente (usando get-location) consente di farlo funzionare in più scenari (anche questo tirerà indietro le informazioni sulle unità locali sulla macchina).

Per farlo funzionare su entrambe le unità locali e mappate, viene eseguito il confronto per popolare $ root con la lettera dell'unità o il percorso di rete. .Root restituirà la lettera dell'unità e .DisplayRoot tirerà indietro il percorso di rete (null se si tratta di un percorso locale, che è la ragione del confronto)

Utilizzando Join-Path, è possibile riunire il percorso, che restituirà una lettera di unità e la posizione corrente se si tratta di un percorso locale, percorso di rete e posizione corrente se si tratta di un'unità mappata.


Spiegare come funziona?
Adam,

1
Aggiunta spiegazione - Grazie per averlo chiamato.
Ryan,

1
Proprio come informazioni se lavori con SharePoint. Ho mappato un'unità su una raccolta documenti di SharePoint utilizzando il cmdlet New-PSDrive. In questo caso ho la lettera di unità nella proprietà Name, la proprietà Root contiene il percorso UNC e la proprietà DisplayRoot è vuota.
pholpar l'

0

Quindi, combinando qui la migliore delle risposte in una sola riga; Verifica il percorso corrente come UNC, associa un'unità al percorso corrente, passa a una nuova unità mappata, se è già un'unità mappata, non viene intrapresa alcuna azione.

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}

Non intendo rispondere al PO, basta aggiungere contenuti utili. Avevo uno script di cui avevo bisogno di mappare l'unità anziché i percorsi UNC, quindi l'ho fatto per verificare se in PS veniva utilizzato un UNC, quindi mappare su un'unità utilizzando quel percorso UNC, quindi passare a quella lettera di unità.


-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
Potresti approfondire cosa fa questo codice? Consulta la sezione Come rispondere e partecipa al nostro tour .
Burgi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.