पावरशेल में स्थानीय पथ से वर्तमान UNC पथ प्राप्त करें


10

यह मानते हुए कि मेरे पास मैप्ड ड्राइव M:\है \\SomeServer\SomeShareऔर पावरशेल में मैं फ़ोल्डर में M:\SomeFolderहूं कि मैं इसे यूएनसी पथ में कैसे परिवर्तित करूं, अर्थात \\SomeServer\SomeShare\SomeFolder


स्टैकओवरफ्लो पर होना चाहिए?
1:16

जवाबों:


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)

$ अनपैथ में UNC पथ होना चाहिए जिसे आप ढूंढ रहे हैं।


बहुत बहुत धन्यवाद, जो पूरी तरह से काम करता है। मैंने इसे स्थानीय पथों के साथ काम करने के लिए थोड़ा संशोधित किया है, यह मेरी कष्टप्रद समस्याओं को एक ड्राइव पर StExBar + runas + powerhell के साथ ठीक करना चाहिए।
क्रिस चिल्वर्स

@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

मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर किसी को इसके एक लाइन संस्करण की आवश्यकता है:

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

ध्यान दें कि यह केवल तभी काम करता है जब आप वास्तव में ड्राइव-मैप्ड नेटवर्क पथ पर हों। यदि आप किसी स्थानीय पथ पर हैं, तो प्रदातानाम शून्य है; यदि आप एक गैर-ड्राइव-मैप नेटवर्क पथ पर हैं, तो ड्राइव अशक्त है। यदि आपको इन 3 मामलों के बीच अंतर करने की आवश्यकता है, तो एक-लाइनर इसे नहीं काटेगा।
टिम्बो

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 एक ड्राइव (नाम, प्रयुक्त / निशुल्क स्थान, प्रदाता, रूट और वर्तमान स्थान) के बारे में सभी जानकारी को वापस खींच लेगा और वर्तमान पैरामीटर अक्षर (गेट-लोकेशन का उपयोग करके) के रूप में नाम पैरामीटर को पास करने से यह कई स्केनरियोस में काम करने की अनुमति देता है (यह मशीन पर स्थानीय ड्राइव की जानकारी भी वापस खींच लेगा)।

इसे स्थानीय और मैप किए गए दोनों ड्राइव पर काम करने के लिए ड्राइव लेटर या नेटवर्क लोकेशन के साथ $ जड़ को पॉप्युलेट करने के लिए तुलना की जाती है। .Root ड्राइव लेटर को वापस भेज देगा, और .DisplayRoot नेटवर्क पाथ को वापस खींच लेगा (यदि यह एक लोकल पाथ है, जो कि तुलना का कारण है)

Join-Path का उपयोग करते हुए, फिर आप एक साथ पाथ खींच सकते हैं, जो एक ड्राइव लेटर और करंट लोकेशन को लौटा देगा यदि यह एक लोकल पाथ, नेटवर्क पाथ और करंट लोकेशन है यदि यह मैप्ड ड्राइव है।


बताएं कि यह कैसे काम करता है?
एडम

1
जोड़ा स्पष्टीकरण - कि बाहर बुलाने के लिए धन्यवाद।
रयान

1
यदि आप SharePoint के साथ काम कर रहे हैं तो बस जानकारी। मैंने नई-PSDrive cmdlet का उपयोग करके SharePoint दस्तावेज़ लाइब्रेरी में एक ड्राइव मैप की है। इस मामले में मेरे पास नाम संपत्ति में ड्राइव अक्षर है, रूट संपत्ति में UNC पथ है, और DisplayRoot गुण रिक्त है।
फोलपर

0

तो यहां सर्वश्रेष्ठ उत्तरों को एक-लाइनर में संयोजित करना; यूएनसी के रूप में वर्तमान पथ के लिए टेस्ट, वर्तमान पथ पर ड्राइव को मैप करता है, नए मैप किए गए ड्राइव में परिवर्तन करता है, यदि पहले से मैप किया गया ड्राइव है, तो कोई कार्रवाई नहीं की जाती है।

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}

ओपी का जवाब देने का इरादा नहीं है, बस उपयोगी सामग्री जोड़ें। एक स्क्रिप्ट थी जिसे मुझे UNC रास्तों के बजाय मैप की गई ड्राइव की आवश्यकता थी, इसलिए मैंने यह जांचने के लिए किया कि यदि कोई UNC PS में उपयोग किया जा रहा है, तो उस 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
Coul आप विस्तृत करते हैं कि यह कोड क्या करता है? कृपया देखें कि कैसे उत्तर दें और हमारा भ्रमण करें
बरगी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.