PowerShell में फ़ाइलों का पूरा पथ प्राप्त करें


146

मुझे सबफ़ोल्डर्स में मौजूद फ़ाइलों सहित सभी फ़ाइलों को प्राप्त करने की आवश्यकता है जो एक विशेष प्रकार के हैं।

मैं कुछ इस तरह से कर रहा हूँ, Get-ChildItem का उपयोग करके :

Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"}

हालाँकि, यह केवल मुझे फाइलों के नाम लौटा रहा है और पूरे रास्ते को नहीं।

जवाबों:


220

| select FullNameऊपर अपनी लाइन के अंत में जोड़ें । यदि आपको वास्तव में उसके साथ कुछ करने की आवश्यकता है, तो आपको इसे फॉर्च लूप में पाइप करना पड़ सकता है, जैसे:

get-childitem "C:\windows\System32" -recurse | where {$_.extension -eq ".txt"} | % {
     Write-Host $_.FullName
}

101

यह देर से छानने का उपयोग करने की तुलना में बहुत तेज प्रदर्शन करना चाहिए:

Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }

14
यह सच है। एक चेतावनी: यह कमांड वास्तव में *.txt*( -Filterसीएमडी वाइल्डकार्ड का उपयोग करता है) जैसी फाइलें प्राप्त करता है। यदि यह वह नहीं है जो आप चाहते हैं तो उपयोग करें -Include *.txt
रोमन कुज़मिन

26

आप चाहें तो Select-Object का भी उपयोग कर सकते हैं :

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName

5
ध्यान दें कि Select-Objectरिटर्न PSCustomObject, एक स्ट्रिंग नहीं है। यदि आप किसी अन्य प्रोग्राम के लिए परिणाम के रूप में उपयोग करते हैं तो यह काम नहीं कर सकता है
चिनट्सु

5
हाँ @ चिन्तु ने क्या कहा। के बजाय तार पाने के लिए PSCustomObject, -ExpandProperty FullNameबस के बजाय का उपयोग करें FullName। जहां तक ​​मैं समझता हूं, -ExpandPropertyपैरामीटर cmdlet को निर्दिष्ट संपत्ति (मूल?) प्रकार के बजाय कुछ कस्टम ऑब्जेक्ट के रूप में परिणाम वापस करने का कारण बनता है।
डबलडाउन

मुझे समय की भी आवश्यकता थी (मैंने एक कार्यक्रम के स्रोत के साथ खिलवाड़ किया और बाद में सोचा कि मुझे शायद इस पर स्रोत नियंत्रण शुरू करना चाहिए था, लेकिन मैं स्थापना के बाद से फाइलें प्राप्त करके "मास्टर" के खिलाफ अपनी पहली प्रतिबद्धता का विचार प्राप्त कर सकता हूं:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
नील गाय लिंडबर्ग


9

यदि रिश्तेदार पथ आप चाहते हैं तो आप केवल -Nameध्वज का उपयोग कर सकते हैं ।

Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name


5
Get-ChildItem -Recurse *.txt | Format-Table FullName

यही मैंने प्रयोग किया है। मुझे लगता है कि यह अधिक समझने योग्य है क्योंकि इसमें कोई लूप सिंटैक्स नहीं है।


5

पीएस 5 में वास्तव में कष्टप्रद बात है, जहां $ _ फोरच के भीतर पूर्ण पथ नहीं होगी। ये FileInfo और DirectoryInfo ऑब्जेक्ट्स के स्ट्रिंग संस्करण हैं। किसी कारण से मार्ग में एक वाइल्डकार्ड इसे ठीक करता है, या पॉवर्सशेल 6 या 7. का उपयोग करें। आप बीच-बीच में प्राप्त करने के लिए पाइप भी कर सकते हैं।

Get-ChildItem -path C:\WINDOWS\System32\*.txt -Recurse | foreach { "$_" }

Get-ChildItem -path C:\WINDOWS\System32 -Recurse | get-item | foreach { "$_" }

ऐसा लगता है कि .Net कोर ( पॉवर्सशेल 7) में हल होने वाले नेट के साथ एक मुद्दा रहा है: v6.0.2 # 7132 के बाद से फाइलइन्फो / निर्देशिका इंस्टेंसेस का स्ट्रिंग व्यवहार बदल गया है


4

यह मेरे लिए काम करता है, और नामों की एक सूची तैयार करता है:

$Thisfile=(get-childitem -path 10* -include '*.JPG' -recurse).fullname

मैंने इसे उपयोग करके पाया get-member -membertype properties, एक अविश्वसनीय रूप से उपयोगी कमांड। यह आपके द्वारा दिए गए अधिकांश विकल्पों में से एक है .<thing>, जैसे fullnameयहाँ है। आप उसी कमांड को छड़ी कर सकते हैं;

  | get-member -membertype properties 

किसी भी आदेश के अंत में उन चीजों पर अधिक जानकारी प्राप्त करें जो आप उनके साथ कर सकते हैं और उन तक कैसे पहुँचें:

get-childitem -path 10* -include '*.JPG' -recurse | get-member -membertype properties

3

इसे इस्तेमाल करे:

Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName

2
कृपया इस बात पर थोड़ी जानकारी जोड़ें कि आपके प्रयास से क्या अलग है और दूसरे ने काम क्यों नहीं किया।
उवे एलेनर

2

फ़ॉरच लूप का उपयोग अभी तक किसी ने क्यों नहीं किया है? एक समर्थक यहाँ है कि आप आसानी से अपने चर का नाम दे सकते हैं:

# Note that I'm pretty explicit here. This would work as well as the line after:
# Get-ChildItem -Recurse C:\windows\System32\*.txt
$fileList = Get-ChildItem -Recurse -Path C:\windows\System32 -Include *.txt
foreach ($textfile in $fileList) {
    # This includes the filename ;)
    $filePath = $textfile.fullname
    # You can replace the next line with whatever you want to.
    Write-Output $filePath
}

मैं फ़ाइललेस्ट में फ़ॉरेस्ट टेक्स्टफ़ाइल का उपयोग किए बिना किसी टेक्स्टफ़ाइल के व्यक्तिगत फ़ाइलपथ को कैसे प्राप्त कर सकता हूं? textfile = $ fileList [$ i] .fullname जैसा कुछ, मुझे पता है कि यह सबसे इष्टतम दृष्टिकोण नहीं है, लेकिन मुझे इसे इस तरह बनाने की आवश्यकता है :(
हेबर सॉलिस

बस एक जोड़ने $के सामने textfile: $textfile = $fileList[$i].FullName। मान लें $iकि एक संख्यात्मक मान है, जो है।
नास्त्रेदविद

1
gci "C:\WINDOWS\System32" -r -include .txt | select fullname

6
क्या आप कृपया अपने समाधान के बारे में थोड़ा और विवरण जोड़कर अपने उत्तर को विस्तृत कर सकते हैं?
अबरीसन

1

[वैकल्पिक वाक्यविन्यास]

कुछ लोगों के लिए, दिशात्मक पाइप संचालक उनका स्वाद नहीं हैं, लेकिन वे चाइनिंग करना पसंद करते हैं। इस मुद्दे पर कुछ दिलचस्प राय देखें रसेलिन मुद्दा ट्रैकर में साझा किया गया: डॉटनेट / रोज़लिन # 5445

मामले और संदर्भ के आधार पर, इस दृष्टिकोण में से एक को अंतर्निहित (या अप्रत्यक्ष) माना जा सकता है। उदाहरण के लिए, इस मामले में enumerable के खिलाफ पाइप का उपयोग करके विशेष टोकन $_(उर्फ) की आवश्यकता होती हैPowerShell's "THIS" token ) कुछ के लिए अरुचिकर दिखाई दे सकती है।

ऐसे फालो के लिए, यहाँ एक और संक्षिप्त, सीधे-सीधे तरीके से डॉट चाइनिंग के साथ किया जा रहा है :

(gci . -re -fi *.txt).FullName

(<शेख़ी> ध्यान दें कि PowerShell के आदेश तर्क पार्सर आंशिक पैरामीटर नाम स्वीकार करता है तो के अलावा। -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -recऔर -reस्वीकार किए जाते हैं, लेकिन दुर्भाग्य से नहीं -r.. जो केवल सही विकल्प है कि एक साथ समझ में आता है है -चरित्र (यदि हम POSIXy UNIXy सम्मेलनों द्वारा जाना!)! </ rant>)


1
शेख़ी पर ध्यान दें: -rलघु रूप -Recurseमेरे लिए ठीक काम करता है।
पॉलीमोर्फिक्स

@ पॉलीमॉर्फिक्स, आप सही हैं, यह मेरे लिए विंडोज 10 पर काम कर रहा है (यह सुनिश्चित नहीं है कि मैं पहले कौन सा संस्करण आज़मा रहा था)। हालांकि, नमूना में -Fileस्विच के साथ भी यही सच है -fi: -filऔर -fileकाम करता है, लेकिन नहीं -f। POSIX शैली द्वारा जाना, यह --file(बहु-अक्षर) और -f(एकल-पत्र, जब तक -f कुछ और के लिए आरक्षित न हो, forceस्विच कहें , तो यह कुछ और हो सकता है जैसे -lया कोई एकल-अक्षर विकल्प नहीं)।
वल्केन रैवेन

1

मैं सभी फ़ोल्डर पथ को निकालने के लिए स्क्रिप्ट का उपयोग कर रहा हूं:

Get-ChildItem -path "C:\" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object FullName | Out-File "Folder_List.csv"

पूर्ण फ़ोल्डर पथ नहीं आ रहा है। 113 वर्णों के बाद, आ रहा है:

Example - C:\ProgramData\Microsoft\Windows\DeviceMetadataCache\dmrccache\en-US\ec4d5fdd-aa12-400f-83e2-7b0ea6023eb7\Windows...

0

मैंने "C: \ Temp" में ".xlm" फ़ाइलों को खोजने के लिए इस लाइन कमांड का उपयोग किया और फ़ाइल "result.txt" में परिणाम का पूरा नाम प्रिंट करें:

(Get-ChildItem "C:\Temp" -Recurse | where {$_.extension -eq ".xml"} ).fullname > result.txt 

मेरे परीक्षणों में, यह वाक्य रचना मेरे लिए सुंदर काम करती है।

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