Powershell में माता-पिता की मूल निर्देशिका कैसे प्राप्त करें?


95

इसलिए अगर मेरे पास एक चर में एक निर्देशिका संग्रहीत है, तो कहें:

$scriptPath = (Get-ScriptDirectory);

अब मैं निर्देशिका को दो मूल स्तर तक खोजना चाहूंगा ।

मुझे करने का एक अच्छा तरीका चाहिए:

$parentPath = Split-Path -parent $scriptPath
$rootPath = Split-Path -parent $parentPath

क्या मैं कोड की एक पंक्ति में रूटपाथ पर पहुँच सकता हूँ?

जवाबों:


162

एक निर्देशिका के लिए संस्करण

get-item आपका मित्र यहाँ मदद कर रहा है।

(get-item $scriptPath ).parent.parent

यदि आप केवल तार चाहते हैं

(get-item $scriptPath ).parent.parent.FullName

एक फ़ाइल के लिए संस्करण

यदि $scriptPathकिसी फ़ाइल की ओर इशारा करता है तो आपको Directoryपहले उस पर संपत्ति को कॉल करना होगा, इसलिए कॉल इस तरह दिखाई देगी

(get-item $scriptPath).Directory.Parent.Parent.FullName

टिप्पणियां
यह तभी काम करेंगे $scriptPathमौजूद है। अन्यथा आपको Split-Pathcmdlet का उपयोग करना होगा ।


बहुत बढ़िया @rerun, जो निर्देशिका ऑब्जेक्ट लौटाता है, फिर एक स्ट्रिंग में पथ को वापस करने के लिए क्या कमांड है?
मार्क काडलेक

12
.parentकेवल निर्देशिका वस्तुओं पर काम करता है। अगर मेरे पास एक फ़ाइल के लिए एक रास्ता है, और मैं उस निर्देशिका के माता-पिता को ढूंढना चाहता हूं जो फ़ाइल में है, तो मुझे उपयोग करने की आवश्यकता है(get-item $PathToFile ).Directory.parent
Baodad

6
ध्यान दें कि यह तभी काम करता है जब $scriptPathमौजूद हो। अन्यथा सिर्फ उपयोग करें Split-Path $scriptPath -parent
orad

2
मैंने आपके उत्तर में @Baodad टिप्पणी का एक मर्ज प्रस्तावित किया है, इसलिए यह SO के अन्य सदस्यों को अधिक दिखाई देता है।
सोयडर

34

मैंने इसे इस तरह हल किया है:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent

$RootPath = Split-Path (Split-Path $PSScriptRoot)के बाद से भी काम करता -Parentहै के लिए डिफ़ॉल्ट स्थान विभाजन पैरामीटर हैSplit-Path
jarrad_obrien

21

आप इसे बैकस्लैश पर विभाजित कर सकते हैं, और नेगेटिव ऐरे इंडेक्सिंग के साथ नेक्स्ट-टू-लास्ट को ले सकते हैं ताकि सिर्फ दादा-दादी निर्देशिका नाम प्राप्त कर सकें।

($scriptpath -split '\\')[-2]

रेगेक्स में बचने के लिए आपको बैकस्लैश को डबल करना होगा।

संपूर्ण पथ प्राप्त करने के लिए:

($path -split '\\')[0..(($path -split '\\').count -2)] -join '\'

और, विभाजन-पथ के लिए मापदंडों को देखते हुए, यह पाइपलाइन इनपुट के रूप में पथ लेता है, इसलिए:

$rootpath = $scriptpath | split-path -parent | split-path -parent

पहले उन मापदंडों को जांचना चाहिए था।
मझौलिन

12

आप उपयोग कर सकते हैं

(get-item $scriptPath).Directoryname

स्ट्रिंग पथ प्राप्त करने के लिए या यदि आप निर्देशिका प्रकार का उपयोग करना चाहते हैं:

(get-item $scriptPath).Directory

5

PowerShell 3 में, $PsScriptRootया दो अभिभावकों के आपके प्रश्न के लिए,

$dir = ls "$PsScriptRoot\..\.."

5

आप बस split-pathकी जरूरत के रूप में कई श्रृंखला कर सकते हैं :

$rootPath = $scriptPath | split-path | split-path


2

अन्य उत्तरों पर थोड़ा सा एक्सट्रपलेशन करने के लिए (शुरुआत में अनुकूल तरीके से जितना संभव हो):

  • स्ट्रिंग ऑब्जेक्ट्स जो मान्य पथ को इंगित करते हैं, उन्हें Get-Item और Get-ChildItem जैसे फ़ंक्शन के माध्यम से DirectoryInfo / FileInfo ऑब्जेक्ट में परिवर्तित किया जा सकता है।
  • .Parent केवल एक DirectoryInfo ऑब्जेक्ट पर उपयोग किया जा सकता है।
  • .Directory FileInfo ऑब्जेक्ट को DirectoryInfo ऑब्जेक्ट में कनवर्ट करता है, और यदि किसी अन्य प्रकार (यहां तक ​​कि किसी अन्य DirectoryInfo ऑब्जेक्ट) पर उपयोग किया जाता है, तो यह रिक्त हो जाएगा।
  • .DirectoryName एक FileInfo ऑब्जेक्ट को स्ट्रिंग ऑब्जेक्ट में कनवर्ट करता है, और किसी अन्य प्रकार (यहां तक ​​कि किसी अन्य स्ट्रिंग ऑब्जेक्ट) पर उपयोग किए जाने पर अशक्त वापस आ जाएगा।
  • .FullName एक DirectoryInfo / FileInfo ऑब्जेक्ट को स्ट्रिंग ऑब्जेक्ट में कनवर्ट करता है, और किसी अन्य प्रकार (यहां तक ​​कि किसी अन्य DirectoryInfo / FileInfo ऑब्जेक्ट) पर उपयोग किए जाने पर अशक्त वापस आ जाएगा।

ऑब्जेक्ट प्रकार GetType विधि के साथ देखें कि आप क्या काम कर रहे हैं: $scriptPath.GetType()

अंत में, एक त्वरित टिप जो वन-लाइनर्स बनाने में मदद करता है: गेट-आइटम में giउपनाम है और गेट-चाइल्डइम में gciउपनाम है।


0

यदि आप $ PSScriptRoot का उपयोग करना चाहते हैं तो आप कर सकते हैं

Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve

0

शक्तियों में:

$this_script_path = $(Get-Item $($MyInvocation.MyCommand.Path)).DirectoryName

$parent_folder = Split-Path $this_script_path -Leaf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.