পাওয়ারশেলে ফাইলের নাম থেকে পাথ এবং এক্সটেনশন সরানো


103

আমার কাছে স্ট্রিংগুলির একটি সিরিজ রয়েছে যা ফাইলগুলির পুরো পথ। আমি ফাইল এক্সটেনশান এবং অগ্রণী পথ ছাড়াই কেবল ফাইলের নাম সংরক্ষণ করতে চাই। সুতরাং এটি থেকে:

c:\temp\myfile.txt

প্রতি

myfile

আমি আসলে কোনও ডিরেক্টরি দিয়ে পুনরাবৃত্তি করি না, এক্ষেত্রে পাওয়ারশেলের basenameসম্পত্তির মতো কিছু ব্যবহার করা যেতে পারে, তবে আমি কেবল স্ট্রিংগুলির সাথেই কাজ করছি।


7
অনেক উত্তর প্রশ্নের দ্বিতীয় অংশ বিবেচনায় নিচ্ছে না। যখন গেট-আইটেম, গেট-চাইল্ড আইটেম বা তাদের এলিয়াস এলএস, দির, জিআই, জিসিআই ব্যবহার করা হয় তখন পরীক্ষিত স্ট্রিংয়ের ফাইলটি অবশ্যই উপস্থিত থাকে । যখন আমরা একটি স্ট্রিংয়ের সিরিজ পরীক্ষা করছি এবং কোনও ডিরেক্টরিতে পুনরাবৃত্তি করছি না , তখন অবশ্যই ধরে নেওয়া উচিত যে এই স্ক্রিপ্টটি চালিত হবে এমন কম্পিউটারগুলিতে সেই ফাইলগুলির অস্তিত্বের প্রয়োজন নেই।
পাপো

উত্তর:


112

এর জন্য একটি সহজ। নেট পদ্ধতি রয়েছে:

C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile

97

পুরো পথ, ডিরেক্টরি, ফাইলের নাম বা ফাইলের এক্সটেনশান প্রদর্শনের সমস্যাটি সমাধান করার জন্য আমি ভেবেছিলাম তার চেয়ে সহজ উপায়।

$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)

27
সেরা কোড স্নিপেটের প্রতিটি উদাহরণের পাশে আপনি ঠিক কী পাঠ্যটি ফিরে আসবে তা দেখিয়ে দিলে ভাল লাগবে।
মারাত্মক ডগ

উদাহরণস্বরূপ যেখানে আমি .csr ফাইলের নাম জানি না, তবে আমি জানি যে একটি ফাইল উপস্থিত রয়েছে: $csr = Get-ChildItem -Path "$($domain.FullName)/*.csr"তারপরেWrite-Host "fileName: $($csr.Basename)"
স্কট পেলাক

47

@ ওয়ালিড 2 মির উত্তরে অনুপ্রাণিত :

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

দয়া করে নোট করুন: প্রদত্ত ফাইলটি সত্যই উপস্থিত থাকলে এটি কেবলমাত্র কাজ করে ।


4
একক ফাইলের জন্য ফাইলের নাম পাওয়ার এটি সহজতম উপায়।
8

7
এটি ধরে নেয় ফাইলটি বিদ্যমান। ফাইলের নাম থেকে কোনও এক্সটেনশন সরানো তার উপর নির্ভর করে না। আপনি যদি এমন কোনও ফাইল নামের উপর ভিত্তি করে কোনও ফাইল তৈরি করেন যেখানে ফাইলটি নেই? পাথটি একটি স্ট্রিং এবং একটি স্ট্রিং হিসাবে বিবেচনা করা উচিত, এটি বিদ্যমান ফাইল হিসাবে ধরে নেওয়া যায় না।
অ্যান্টনি বুথ

30

বা

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

বা

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

9
দ্বিতীয় উদাহরণটি এমন কোনও কিছু দিয়ে খুব বেশি ভাল কাজ করে না - "সি: \ ডাউনলোডগুলি \ রিসার্চারসেটআপ .0.০.77..০.এসসি" .স্প্লিট ('\।') [- 2]
কিথ হিল

24

আপনি বেসন সম্পত্তি ব্যবহার করতে পারেন

PS II> ls *.ps1 | select basename

7
ওপি বলুন: আমি আসলে কোনও ডিরেক্টরি দিয়ে পুনরাবৃত্তি করছি না।
সিবি

4
আমার জন্য খুব দরকারী!
iheartchaharp


4

যেকোন নির্বিচার পাথ স্ট্রিং দেওয়া, সিস্টেমের বিভিন্ন স্থিতিশীল পদ্ধতি I

strTestPath = C: \ ব্যবহারকারীরা \ ড্যাজি \ নথিগুলি \ নিবন্ধগুলি_2018 \ এনটিএফএস_ফাই_টাইম_ইন_সিসিএম \ পাথস্ট্রিংআইএনফো.পিএস 1
গেটডাইরেক্টরিনাম = সি: \ ব্যবহারকারীরা \ ড্যাজি \ নথি \ নিবন্ধ_2018 \ এনটিএফএস_ফাইলে_টাইম_ইন_সিএমডি
GetFileName = PathStringInfo.ps1
গেটএক্সটেনশন = .ps1
GetFileNameWithoutExistance = 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 ) );

স্ক্রিপ্টটি রচনা ও পরীক্ষণ যা উপরোক্ত উত্সকে জেনারেট করে যে পাওয়ারশেল কীভাবে সি #, সি, সি ++, উইন্ডোজ এনটি কমান্ড স্ক্রিপ্টিং ভাষা থেকে আলাদা এবং আমার যা কিছু অভিজ্ঞতা আছে তার সব কিছুর বিষয়ে কিছু উদ্দীপনা প্রকাশ করেছিল।


3

পাওয়ারশেল 6 দিয়ে শুরু করে আপনি ফাইলের নামটি এ জাতীয় এক্সটেনশান ছাড়াই পাবেন:

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

পাওয়ারশেল 6. এ এটি সঠিক 6.. বগ স্ট্যান্ডার্ড 5.1
ফিনলেবব

4
তথ্যের জন্য ধন্যবাদ, আমি সেই অনুযায়ী অ্যানওয়ার আপডেট করেছি। বগ কি ?
রেনি নিফেনিগার 16

4
ক্ষমা প্রার্থনা :) আমি যেখান থেকে (ইউকে) আছি, "বোগ স্ট্যান্ডার্ড" এমন কোনও কিছুর জন্য অপ্রয়োজনীয় শব্দ যা সম্পূর্ণ সাধারণ, "ভ্যানিলা" সংস্করণ।
ফাইনলেবব

2

এই স্ক্রিপ্টটি একটি ফোল্ডার এবং সাব ফোল্ডারগুলিতে অনুসন্ধান করে এবং তাদের এক্সটেনশানটি সরিয়ে ফাইলের নাম পরিবর্তন করে

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

    Foreach-Object {

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

    }

2

রেনা নাইফেনিগার এর উত্তরে প্রসারিত, যাদের পাওয়ারশেল সংস্করণ 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 " প্রদান করে। এখানে আমি প্রতিস্থাপন () এর পরিবর্তে সাবস্ট্রিং () ব্যবহার করতে পছন্দ করি কারণ আমার উদাহরণ অনুসারে কোনও সময়ের পূর্ববর্তী এক্সটেনশনও নামের অংশ হতে পারে। সাবস্ট্রিং ব্যবহার করে আমরা অনুরোধ হিসাবে এক্সটেনশন ছাড়াই ফাইলের নামটি ফিরিয়ে দিই।


4
এই উত্তরের জন্য আপনাকে অনেক ধন্যবাদ, এটি খুব সম্পূর্ণ এবং এটি আমাকে সহায়তা করেছে
স্যাম


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

4
এত শক্ত পথ কেন?
জারোস্লাভ reত্রেইট

4
যদি ফাইলনামে একাধিক সময়সীমা থাকে তবে কাজ করে না, উদাহরণস্বরূপ MyApp.exe.config
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.