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.