शक्तियों में फ़ाइल नाम से पथ और विस्तार को हटा रहा है


99

मेरे पास स्ट्रिंग्स की एक श्रृंखला है जो फ़ाइलों के लिए पूर्ण पथ हैं। मैं फ़ाइल एक्सटेंशन और अग्रणी पथ के बिना, केवल फ़ाइल नाम को सहेजना चाहूंगा। तो इस से:

c:\temp\myfile.txt

सेवा

myfile

मैं वास्तव में एक निर्देशिका के माध्यम से पुनरावृत्ति नहीं कर रहा हूं, इस मामले में पावरशेल की basenameसंपत्ति जैसे कुछ का उपयोग किया जा सकता है, बल्कि मैं अकेले तार के साथ काम कर रहा हूं।


7
कई जवाब सवाल के दूसरे भाग को ध्यान में नहीं रख रहे हैं। जब Get-Item, Get-ChildItem, या उनके उपनाम ls, dir, gi, gci का उपयोग किया जाता है, तो परीक्षण स्ट्रिंग से फ़ाइल मौजूद होनी चाहिए । जब हम स्ट्रिंग की एक श्रृंखला की जाँच कर रहे हैं और एक निर्देशिका के माध्यम से पुनरावृत्ति नहीं कर रहे हैं , तो यह माना जाना चाहिए कि उन फ़ाइलों को कंप्यूटर पर मौजूद होने की आवश्यकता नहीं है जहां यह स्क्रिप्ट चलाई जाएगी।
पापो

जवाबों:



93

पूर्ण पथ, निर्देशिका, फ़ाइल नाम या फ़ाइल एक्सटेंशन प्रदर्शित करने के मुद्दे को संबोधित करने के लिए मैंने जितना सोचा था उससे आसान है।

$PSCommandPath
(Get-Item $PSCommandPath ).Extension
(Get-Item $PSCommandPath ).Basename
(Get-Item $PSCommandPath ).Name
(Get-Item $PSCommandPath ).DirectoryName
(Get-Item $PSCommandPath ).FullName
$ConfigINI = (Get-Item $PSCommandPath ).DirectoryName+"\"+(Get-Item $PSCommandPath ).BaseName+".ini"
$ConfigINI

अन्य रूप:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
split-path -parent $PSCommandPath
Split-Path $script:MyInvocation.MyCommand.Path
split-path -parent $MyInvocation.MyCommand.Definition
[io.path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)

25
यह अच्छा होगा यदि शीर्ष कोड स्निपेट में प्रत्येक उदाहरण के बगल में आपने दिखाया कि वास्तव में क्या पाठ वापस आ जाएगा।
डेडलीडॉग

उदाहरण जहां मुझे पता नहीं है .csr फ़ाइल का नाम, लेकिन मुझे पता है कि एक फ़ाइल मौजूद है: $csr = Get-ChildItem -Path "$($domain.FullName)/*.csr"तबWrite-Host "fileName: $($csr.Basename)"
स्कॉट पेलाक

46

@ Walid2mi के उत्तर से प्रेरित :

(Get-Item 'c:\temp\myfile.txt').Basename

कृपया ध्यान दें: यह केवल तभी काम करता है जब दी गई फ़ाइल वास्तव में मौजूद हो


1
एकल फ़ाइल के लिए फ़ाइल नाम प्राप्त करने का यह सबसे आसान तरीका है।
marisks

6
यह मानता है कि फ़ाइल मौजूद है। फ़ाइल नाम से एक्सटेंशन निकालना उस पर निर्भर नहीं होना चाहिए। यदि आप फ़ाइल नाम के आधार पर फ़ाइल बना रहे हैं, तो फ़ाइल मौजूद नहीं है? पथ एक स्ट्रिंग है और इसे एक मौजूदा फ़ाइल के रूप में नहीं मानकर स्ट्रिंग के रूप में माना जाना चाहिए।
एंटनी बूथ

29

या

([io.fileinfo]"c:\temp\myfile.txt").basename

या

"c:\temp\myfile.txt".split('\.')[-2]

9
दूसरा उदाहरण कुछ के साथ बहुत अच्छा काम नहीं करता है जैसे - "C: \ Downloads \ ReSharperSetup.7.0.97.60.msi" .split ('\' ') [- 2]
कीथ हिल

24

आप बेसन प्रॉपर्टी का उपयोग कर सकते हैं

PS II> ls *.ps1 | select basename

7
ओपी कहता है: मैं वास्तव में एक निर्देशिका के माध्यम से पुनरावृत्ति नहीं कर रहा हूं।
सीबी।

1
मेरे लिए बहुत उपयोगी है!
इहरतस्कैरप

5

@ कीथ ,

यहाँ एक और विकल्प है:

PS II> $f="C:\Downloads\ReSharperSetup.7.0.97.60.msi"

PS II> $f.split('\')[-1] -replace '\.\w+$'

PS II> $f.Substring(0,$f.LastIndexOf('.')).split('\')[-1]

4

किसी भी मनमाने पथ स्ट्रिंग को देखते हुए, System.IO.Path ऑब्जेक्ट पर विभिन्न स्थिर तरीके निम्नलिखित परिणाम देते हैं।

strTestPath = C: \ Users \ DAG \ Documents \ Article_2018 \ NTFS_File_Times_in_CMD \ PathStringInfo.ps1
GetDirectoryName = C: \ Users \ DAG \ Documents \ Article_2018 \ NTFS_File_Times_in_CMD
GetFileName = PathStringInfo.ps1
GetExtension = .ps1
GetFileNameWithoutExtension = PathStringInfo

निम्नलिखित कोड है जो उपरोक्त आउटपुट उत्पन्न करता है।

[console]::Writeline( "strTestPath                 = {0}{1}" ,
                      $strTestPath , [Environment]::NewLine );
[console]::Writeline( "GetDirectoryName            = {0}" ,
                      [IO.Path]::GetDirectoryName( $strTestPath ) );
[console]::Writeline( "GetFileName                 = {0}" ,
                      [IO.Path]::GetFileName( $strTestPath ) );
[console]::Writeline( "GetExtension                = {0}" ,
                      [IO.Path]::GetExtension( $strTestPath ) );
[console]::Writeline( "GetFileNameWithoutExtension = {0}" ,
                      [IO.Path]::GetFileNameWithoutExtension( $strTestPath ) );

स्क्रिप्ट लिखना और परीक्षण करना जो उपरोक्त उत्पन्न करता है, यह बताता है कि PowerShell C #, C, C ++, Windows NT कमांड स्क्रिप्टिंग भाषा से कैसे अलग है, और इसके बारे में और सब कुछ जिसके बारे में मुझे कोई अनुभव नहीं है, के बारे में कुछ व्याख्याएं हैं।


3

PowerShell 6 से शुरू होकर, आपको बिना विस्तार के फ़ाइल नाम मिलता है:

split-path c:\temp\myfile.txt -leafBase

यह पॉवरशेल 6. में सही है। दलदल में कोई पत्ताबेस नहीं है 5.1
फिनलेबोब

1
जानकारी के लिए धन्यवाद, मैंने तदनुसार awer को अद्यतन किया है। क्या है दलदल ?
रेने न्यफेनेगर

2
क्षमायाचना :) जहां मैं (यूके) से हूं, "बोग स्टैंडर्ड" एक ऐसी चीज है जो पूरी तरह से सामान्य है, एक "वैनिला" संस्करण है।
फिनालेबॉब

2

यह स्क्रिप्ट एक फ़ोल्डर और उप फ़ोल्डर में खोज करती है और उनके एक्सटेंशन को हटाकर फाइलों का नाम बदल देती है

    Get-ChildItem -Path "C:/" -Recurse -Filter *.wctc |

    Foreach-Object {

      rename-item $_.fullname -newname $_.basename

    }

2

रेने न्यफेनेगर के जवाब पर विस्तार करते हुए, जिनके पास PowerShell संस्करण 6.x तक पहुंच नहीं है, हम स्प्लिट पाथ का उपयोग करते हैं, जो फ़ाइल अस्तित्व के लिए परीक्षण नहीं करता है:

Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf

यह " myfile.txt " देता है। यदि हम जानते हैं कि फ़ाइल नाम में अवधि नहीं है, तो हम स्ट्रिंग को विभाजित कर सकते हैं और पहला भाग ले सकते हैं:

(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.') | Select -First 1

या

(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.')[0]

यह " मायफाइल " देता है। यदि फ़ाइल नाम में समयावधि शामिल हो सकती है, तो सुरक्षित रहने के लिए, हम निम्नलिखित का उपयोग कर सकते हैं:

$FileName = Split-Path "C:\Folder\SubFolder\myfile.txt.config.txt" -Leaf
$Extension = $FileName.Split('.') | Select -Last 1
$FileNameWoExt = $FileName.Substring(0, $FileName.Length - $Extension.Length - 1)

यह " myfile.txt.config " देता है। यहां मैं प्रतिस्थापन () के बजाय सबस्ट्रिंग () का उपयोग करना पसंद करता हूं क्योंकि एक अवधि से पहले का विस्तार भी मेरे उदाहरण के अनुसार, नाम का हिस्सा हो सकता है। एस्ट्रिंग का उपयोग करके हम अनुरोध के अनुसार विस्तार के बिना फ़ाइल नाम वापस करते हैं।


1
इस उत्तर के लिए बहुत-बहुत धन्यवाद, यह बहुत पूरा हुआ और इसने मेरी मदद की
सैम


1

यह स्ट्रिंग को दो बार विभाजित करके किया जा सकता है।

#Path
$Link = "http://some.url/some/path/file.name"

#Split path on "/"
#Results of split will look like this : 
# http:
#
# some.url
# some
# path
# file.name
$Split = $Link.Split("/")

#Count how many Split strings there are
#There are 6 strings that have been split in my example
$SplitCount = $Split.Count

#Select the last string
#Result of this selection : 
# file.name
$FilenameWithExtension = $Split[$SplitCount -1]

#Split filename on "."
#Result of this split : 
# file
# name
$FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")

#Select the first half
#Result of this selection : 
# file
$FilenameWithoutExtension = $FilenameWithExtensionSplit[0]

#The filename without extension is in this variable now
# file
$FilenameWithoutExtension

यहाँ टिप्पणियों के बिना कोड है:

$Link = "http://some.url/some/path/file.name"
$Split = $Link.Split("/")
$SplitCount = $Split.Count
$FilenameWithExtension = $Split[$SplitCount -1]
$FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")
$FilenameWithoutExtension = $FilenameWithExtensionSplit[0]
$FilenameWithoutExtension

1
इतना कठिन रास्ता क्यों?
जारोस्लाव ittreit

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