ফাইল-পাথের মধ্যে আরও দুটি স্ট্রিং একত্রিত করতে আমি কীভাবে জোড়-পথ ব্যবহার করব?


105

যদি আমি কোনও ফাইলের পথে দুটি স্ট্রিং একত্রিত করতে Join-Pathচাই তবে আমি এটি ব্যবহার করি :

$path = Join-Path C: "Program Files"
Write-Host $path

প্রিন্ট "C:\Program Files"। আমি যদি আরও দুটি স্ট্রিংয়ের জন্য এটি করতে চাই তবে:

$path = Join-Path C: "Program Files" "Microsoft Office"
Write-Host $path

পাওয়ারশেল একটি ত্রুটি ছুড়ে ফেলেছে:

যোগদানের পথে: একটি অবস্থানগত পরামিতি খুঁজে পাওয়া যায় না যা 'মাইক্রোসফ্ট অফিস' যুক্তি স্বীকার করে।
ডি তে: \ ব্যবহারকারীদের \ মা \ my_script.ps1: 1 চর: 18
+ $ পথ = যোগদানের পথ <<<< সি: "প্রোগ্রাম ফাইলগুলি" "মাইক্রোসফ্ট অফিস"
+ বিভাগে তথ্য: অবৈধ আইন: (:) [যোগদানের পথ] , ParameterBindingException
+ + FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell
.Commands.JoinPathCommand

আমি একটি স্ট্রিং অ্যারে ব্যবহার করার চেষ্টা করেছি:

[string[]] $pieces = "C:", "Program Files", "Microsoft Office"
$path = Join-Path $pieces
Write-Host $path

তবে পাওয়ারশেল আমাকে চাইল্ডপথে প্রবেশের জন্য অনুরোধ জানায় (যেহেতু আমি তর্কটি নির্দিষ্ট করে নি -childpath), যেমন "সামপথ", এবং তারপরে তিনটি ফাইল পাথ তৈরি করে,

C:\somepath
Program Files\somepath
Microsoft Office\somepath

যা সঠিকও নয়।

উত্তর:


171

আপনি .NET পাথ ক্লাসটি ব্যবহার করতে পারেন :

[IO.Path]::Combine('C:\', 'Foo', 'Bar')

3
অবশ্যই সবচেয়ে সংক্ষিপ্ত রূপ, এবং পথ বিভাজকগুলি এবং পথের খণ্ডগুলিতে সঠিকভাবে পিছন / শীর্ষস্থানীয় স্ল্যাশ পরিচালনা করে যা বর্তমান স্বীকৃত উত্তর (প্রাথমিক স্ট্রিং কনটেনটেশন) করে না।
ডেভিড কেভেনি

3
আমার পাওয়ারশেলে উপরের কমান্ডটি কার্যকর করার জন্য এই ত্রুটিটি পাওয়া যায় - "একত্রিত করুন" এবং আর্গুমেন্ট গণনা: "3" এর জন্য একটি ওভারলোড খুঁজে পাওয়া যায় না। লাইনে: 1 চর: 19 + [io.path] :: একত্রিত <<<< ('সি: \', 'foo', 'বার') + বিভাগে তথ্য: স্পষ্টিত নয়: (:) [], পদ্ধতিটি এক্সপ্লেশন + সম্পূর্ণরূপে যোগ্যতাযুক্ত করুন: মেথডাউন্টকাউন্ড নটফাইন্ডবেস্ট
আমাল

@ আমল আপনি কী সিএলআর সংস্করণটি চালাচ্ছেন ( $PSVersionTable)? নেই [io.path]::combine([string[]]('c:\','foo','bar'))কাজ করে?
মারেক তোমান

1
মনে হচ্ছে প্যারামিটারের সীমা 3, 3 পরে প্রথম প্যারামিটার উপেক্ষা করা হবে। (এখানে কমপক্ষে, PS 5.1, clr 4.0)
ehiller

4
@ ডেভিডকিভেনি "পাথ বিভাজকগুলিকে সঠিকভাবে পথ বিভাজন এবং পিছনের / শীর্ষস্থানীয় স্ল্যাশগুলি সঠিকভাবে পরিচালনা করে" - সত্যই নয়। join-pathআপনি যা প্রত্যাশা করেন তা করে, join-path "C:\" "\foo"আউটপুটগুলি C:\foo, Path.Combineতবে দ্বিতীয় যুক্তিতে একটি শীর্ষস্থানীয় বিভাজক উপস্থিত থাকলেও প্রথম যুক্তিকে উপেক্ষা করা হয়: [io.path]::combine('c:\', '\foo')বিরক্তিকরভাবে আউটপুট \foo
কোয়ান্টিক

99

যেহেতু জোড়-পথকে কোনও পাথের মান পাইপ করা যায়, তাই আপনি একসাথে একাধিক জোড়-পথের বিবৃতি পাইপ করতে পারেন:

Join-Path "C:" -ChildPath "Windows" | Join-Path -ChildPath "system32" | Join-Path -ChildPath "drivers"

এটি সম্ভবত আপনি এটির মতো নিখরচায় নয়, তবে এটি সম্পূর্ণ পাওয়ারশেল এবং এটি পড়তে তুলনামূলক সহজ।


3
+1 যেহেতু এটি সমস্ত পাওয়ার জুড়ে 2,3,4 জুড়ে কাজ করবে, [io.path] এর সাথে :: :: একত্রিত হওয়া API এর নেট ফ্রেমওয়ার্ক 3,4
রাম

18

PowerShell 6.0 সাল থেকে, যোগ দিন-পাথ টি নতুন পরামিতি নামক -AdditionalChildPathপারে এবং একটি পাথ আউট-অফ-বক্স একাধিক অংশের মেশা । হয় অতিরিক্ত পরামিতি সরবরাহ করে বা কেবলমাত্র উপাদানের একটি তালিকা সরবরাহ করে।

ডকুমেন্টেশন থেকে উদাহরণ :

Join-Path a b c d e f g
a\b\c\d\e\f\g

সুতরাং পাওয়ারশেল 6.0 এ এবং আপনার ভেরিয়েন্টের উপরে

$path = Join-Path C: "Program Files" "Microsoft Office"

প্রত্যাশার মতো কাজ করে!


17

জয়েন্ট-পাথ আপনি যা খুঁজছেন ঠিক তেমন নয়। এটির একাধিক ব্যবহার রয়েছে তবে আপনি যা খুঁজছেন তা নয়। যোগ-পাথের সাথে ভাগ করে নেওয়ার একটি উদাহরণ :

Join-Path C:\hello,d:\goodbye,e:\hola,f:\adios world
C:\hello\world
d:\goodbye\world
e:\hola\world
f:\adios\world

আপনি দেখতে পাচ্ছেন যে এটি স্ট্রিংগুলির একটি অ্যারে গ্রহণ করে, এবং এটি সন্তানের স্ট্রিংটিকে প্রতিটি পূর্ণ পথ তৈরির সাথে সংযুক্ত করে। আপনার উদাহরণে $path = join-path C: "Program Files" "Microsoft Office",। আপনি তিনটি অবস্থানগত তর্কগুলি পাস করার পরে এবং join-pathকেবল দুটি গ্রহণ করার কারণে আপনি ত্রুটিটি পাচ্ছেন । আপনি যা সন্ধান করছেন এটি হ'ল -joinএবং আমি এটি একটি ভুল বোঝাবুঝি হতে দেখলাম। পরিবর্তে এটি আপনার উদাহরণের সাথে বিবেচনা করুন:

"C:","Program Files","Microsoft Office" -join "\"

-Joinআইটেমের অ্যারে নেয় এবং তাদের সাথে \একক স্ট্রিংয়ের সাথে যুক্ত করে।

C:\Program Files\Microsoft Office

উদ্ধারকালে গৌণ চেষ্টা

হ্যাঁ, আমি সম্মত হব যে এই উত্তরটি আরও ভাল তবে আমার এখনও কাজ করতে পারে। মন্তব্যগুলি পরামর্শ দেয় যে স্ল্যাশগুলির সাথে কোনও সমস্যা হতে পারে, সুতরাং আমার কনটেন্টেশন পদ্ধতির সাথে রাখতে আপনি এটিও করতে পারেন।

"C:","\\Program Files\","Microsoft Office\" -join "\" -replace "(?!^\\)\\{2,}","\"

সুতরাং অতিরিক্ত স্ল্যাশ নিয়ে সমস্যা থাকলে এটি স্ট্রিংয়ের শুরুতে না হওয়া পর্যন্ত এটি পরিচালনা করা যেতে পারে ( ইউএনসি পাথের অনুমতি দেয় )। [io.path]::combine('c:\', 'foo', '\bar\')প্রত্যাশিত হিসাবে কাজ করবে না এবং আমার জন্য অ্যাকাউন্ট হবে। উভয়ই ইনপুটটির জন্য যথাযথ স্ট্রিংগুলির প্রয়োজন কারণ আপনি সমস্ত পরিস্থিতিতে অ্যাকাউন্ট করতে পারেন না। উভয় পদ্ধতির বিবেচনা করুন, তবে, হ্যাঁ, অন্যান্য উচ্চ-রেটযুক্ত উত্তরগুলি আরও সংক্ষিপ্ত, এবং আমি জানি না যে এটি বিদ্যমান।

এছাড়াও, আমি উল্লেখ করতে চাই, আমার উত্তরটি ব্যাখ্যা করে যে মূল সমস্যাটি সমাধানের জন্য কোনও পরামর্শ দেওয়ার উপরে ওপি কীভাবে ভুল করছে was


2
এটি ভুল কারণ যদিও একাধিক একাধিক পথ চলতে সক্ষম হয় তবে এটি কুৎসিত এবং সম্ভাব্য সমস্যা তৈরি করতে পারে।
মিখাইল অরলভ

@ মিখাইলঅরলভ আপনি সম্ভবত কোনও সম্ভাব্য সমস্যাটি যেমন ঘটতে পারে তার পরামর্শ দেওয়ার মতো বর্ণনা করতে পারেন? আপনার আরেকটি পরামর্শ আছে? আমি কোন সমস্যা দেখছি না বলে জিজ্ঞাসা করছি। কিছু ভুল হলে আমি এটিকে সম্বোধন করতে চাই।
ম্যাট

2
আমি সম্প্রতি প্রচুর নিম্ন মানের কোড পরিচালনা করছি, লোকেরা স্ট্রিংয়ের সাথে পাথগুলি তুলনা করে। স্ট্রিং.স্প্লিট ('\\') এর সাথে ফাঁকা স্ট্রিংগুলি সরিয়ে না দিয়ে পাথগুলি পার্স করে। আমি পরিণতিতে আরও ঝুঁকিপূর্ণ কিছু ভাবতে পারি না, বেশিরভাগ ক্ষেত্রে আমি কেবল ব্যর্থ হই। আপনার সম্পাদনার জন্য আপনাকে ধন্যবাদ।
মিখাইল অরলভ

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

10

আপনি যদি এখনও .NET 2.0 ব্যবহার করে থাকেন, তবে [IO.Path]::Combineআপনার params string[]ওভারলোডের দরকার নেই যা আপনার দুটি অংশের বেশি যোগদান করতে হবে এবং আপনি ত্রুটিটি দেখতে পাবে না "সংযুক্ত" এবং আর্গুমেন্ট গণনা: "3" এর জন্য একটি ওভারলোড খুঁজে পাওয়া যাবে না।

সামান্য কম মার্জিত, তবে একটি খাঁটি পাওয়ারশেল সমাধান হ'ল ম্যানুয়ালি পথের অংশগুলিকে একত্রিত করার জন্য:

Join-Path C: (Join-Path  "Program Files" "Microsoft Office")

অথবা

Join-Path  (Join-Path  C: "Program Files") "Microsoft Office"

5

চাইল্ডপ্যাথের জন্য একটি স্ট্রিং অ্যারে ব্যবহার করার সময় আপনি যা চাইবেন তা এখানে করুন।

$path = "C:"
@( "Program Files", "Microsoft Office" ) | %{ $path = Join-Path $path $_ }
Write-Host $path

কোন ফলাফল

C:\Program Files\Microsoft Office

কেবলমাত্র আমি পেয়েছি যে cave পাথের প্রাথমিক মানটির অবশ্যই একটি মান থাকতে হবে (নাল বা খালি হতে পারে না)।


4

একটি পাথে একটি স্বেচ্ছাসেবী সংখ্যক উপাদানগুলিতে যোগদানের জন্য খাঁটি পাওয়ারশেল ফাংশন লেখার আরও দুটি উপায় এখানে।

এই প্রথম ফাংশনটি সমস্ত উপাদান সংরক্ষণ করার জন্য একটি একক অ্যারে এবং তারপরে একটি ফোরচ লুপ ব্যবহার করে:

function Join-Paths {
    Param(
        [Parameter(mandatory)]
        [String[]]
        $Paths
    )
    $output = $Paths[0]
    foreach($path in $Paths[1..$Paths.Count]) {
        $output = Join-Path $output -ChildPath $path
    }
    $output
}

কারণ পথের উপাদানগুলি একটি অ্যারের উপাদান এবং একক যুক্তির সমস্ত অংশ, সেগুলি অবশ্যই কমা দ্বারা পৃথক করা উচিত। ব্যবহার নিম্নরূপ:

PS C: \> যোগদানের পথগুলি 'সি:', 'প্রোগ্রাম ফাইল', 'মাইক্রোসফ্ট অফিস'
সি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট অফিস


এই ফাংশনটি লেখার আরও একটি ন্যূনতম উপায় হ'ল বিল্ট-ইন $argsভেরিয়েবলটি ব্যবহার করা এবং তারপরে মাইকের ফেয়ারের পদ্ধতিটি ব্যবহার করে ফোরচ লুপটিকে একটি একক লাইনে ভেঙে ফেলা উচিত।

function Join-Paths2 {
    $path = $args[0]
    $args[1..$args.Count] | %{ $path = Join-Path $path $_ }
    $path
}

ফাংশনটির পূর্ববর্তী সংস্করণের মতো নয়, প্রতিটি পাথ উপাদান পৃথক যুক্তিযুক্ত, সুতরাং আর্গুমেন্টগুলি পৃথক করার জন্য কেবল একটি স্থান প্রয়োজন:

PS C: \> যোগদানের পথ 2 'সি:' 'প্রোগ্রাম ফাইল' 'মাইক্রোসফ্ট অফিস'
সি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট অফিস

2

জয়েন্ট-পাথের স্টেটমেন্টগুলির পাইপিংয়ের চেয়ে নিম্নলিখিত পদ্ধতিটি আরও সংক্ষিপ্ত:

$p = "a"; "b", "c", "d" | ForEach-Object -Process { $p = Join-Path $p $_ }

$ p এরপরে সংঘবদ্ধ পথ 'a \ b \ c \ d' ধরে।

(আমি কেবল লক্ষ্য করেছি যে এটি মাইক ফেয়ারের ঠিক একই পন্থা, দুঃখিত।)


1

অথবা আপনি এটির জন্য নিজের ফাংশনটি লিখতে পারেন (যা আমি শেষ করেছিলাম)।

function Join-Path-Recursively($PathParts) {
    $NumberOfPathParts = $PathParts.Length;

    if ($NumberOfPathParts -eq 0) {
        return $null
    } elseif ($NumberOfPathParts -eq 1) {
        return $PathParts[0]
    } else {
        return Join-Path -Path $PathParts[0] -ChildPath $(Join-Path-Recursively -PathParts $PathParts[1..($NumberOfPathParts-1)])
    }
}

তারপরে আপনি এইভাবে ফাংশনটি কল করতে পারেন:

Join-Path-Recursively -PathParts  @("C:", "Program Files", "Microsoft Office")
Join-Path-Recursively  @("C:", "Program Files", "Microsoft Office")

এটি সাধারণ জয়েন্ট-পাথ ফাংশনের মতো হুবহু আচরণ করার সুবিধা রয়েছে এবং নেট নেট ফ্রেমওয়ার্কের উপর নির্ভর করে না।


0

আপনি এটি এইভাবে ব্যবহার করতে পারেন:

$root = 'C:'
$folder1 = 'Program Files (x86)'
$folder2 = 'Microsoft.NET'

if (-Not(Test-Path $(Join-Path $root -ChildPath $folder1 | Join-Path -ChildPath $folder2)))
{
   "Folder does not exist"
}
else 
{
   "Folder exist"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.