Jika saya ingin menggabungkan dua string menjadi jalur file, saya menggunakan Join-Path
seperti ini:
$path = Join-Path C: "Program Files"
Write-Host $path
Cetakan itu "C:\Program Files"
. Jika saya ingin melakukan ini untuk lebih dari dua string:
$path = Join-Path C: "Program Files" "Microsoft Office"
Write-Host $path
PowerShell membuat kesalahan:
Jalur Gabungan: Parameter posisi tidak dapat ditemukan yang menerima argumen 'Microsoft Office'.
Di D: \ users \ ma \ my_script.ps1: 1 char: 18
+ $ path = join-path <<<< C: "Program Files" "Microsoft Office"
+ CategoryInfo: InvalidArgument: (:) [Join-Path] , ParameterBindingException
+ FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell
.Commands.JoinPathCommand
Saya mencoba menggunakan array string:
[string[]] $pieces = "C:", "Program Files", "Microsoft Office"
$path = Join-Path $pieces
Write-Host $path
Tapi PowerShell meminta saya untuk masuk ke jalur anak (karena saya tidak menentukan -childpath
argumennya), misalnya "somepath", lalu membuat tiga jalur file,
C:\somepath
Program Files\somepath
Microsoft Office\somepath
yang juga tidak benar.
sumber
$PSVersionTable
)? Apakah[io.path]::combine([string[]]('c:\','foo','bar'))
bekerja?join-path
melakukan apa yang Anda harapkan,join-path "C:\" "\foo"
keluaranC:\foo
,Path.Combine
namun mengabaikan argumen pertama setiap kali argumen kedua berisi pemisah utama:[io.path]::combine('c:\', '\foo')
keluaran yang mengganggu\foo
.Karena Join-Path dapat menyalurkan nilai path, Anda dapat menyalurkan beberapa pernyataan Join-Path bersama-sama:
Ini tidak sesingkat yang mungkin Anda inginkan, tetapi ini sepenuhnya PowerShell dan relatif mudah dibaca.
sumber
Sejak PowerShell 6.0, Join-Path memiliki parameter baru yang dipanggil
-AdditionalChildPath
dan dapat menggabungkan beberapa bagian jalur secara out-of-the-box . Baik dengan memberikan parameter ekstra atau dengan hanya menyediakan daftar elemen.Contoh dari dokumentasi :
Jadi di PowerShell 6.0 dan di atasnya varian Anda
bekerja seperti yang diharapkan!
sumber
Join-Path bukanlah yang Anda cari. Ini memiliki banyak kegunaan tetapi bukan yang Anda cari. Contoh dari Partying with Join-Path :
Anda melihat bahwa itu menerima larik string, dan itu menggabungkan string anak ke setiap jalur lengkap pembuatan. Dalam contoh Anda
$path = join-path C: "Program Files" "Microsoft Office"
,. Anda mendapatkan kesalahan karena Anda meneruskan tiga argumen posisi danjoin-path
hanya menerima dua. Apa yang Anda cari adalah a-join
, dan saya bisa melihat ini sebagai kesalahpahaman. Pertimbangkan sebagai gantinya ini dengan contoh Anda:-Join
mengambil array item dan menggabungkannya\
menjadi satu string.Upaya kecil untuk menyelamatkan
Ya, saya setuju bahwa jawaban ini lebih baik, tetapi jawaban saya masih bisa berfungsi. Komentar menunjukkan bahwa mungkin ada masalah dengan garis miring, jadi untuk tetap menggunakan pendekatan penggabungan saya, Anda juga dapat melakukan ini.
Jadi jika ada masalah dengan garis miring ekstra, itu bisa ditangani selama tidak di awal string (mengizinkan jalur UNC ).
[io.path]::combine('c:\', 'foo', '\bar\')
tidak akan bekerja seperti yang diharapkan dan saya akan menjelaskannya. Keduanya membutuhkan string yang tepat untuk input karena Anda tidak dapat memperhitungkan semua skenario. Pertimbangkan kedua pendekatan tersebut, tetapi, ya, jawaban lain yang berperingkat lebih tinggi lebih singkat, dan saya bahkan tidak tahu itu ada.Juga, ingin menunjukkan, jawaban saya menjelaskan bagaimana kesalahan yang dilakukan OP selain memberikan saran untuk mengatasi masalah inti.
sumber
Jika Anda masih menggunakan .NET 2.0, maka
[IO.Path]::Combine
tidak akan adaparams string[]
kelebihan beban yang Anda perlukan untuk menggabungkan lebih dari dua bagian, dan Anda akan melihat kesalahan Tidak dapat menemukan beban berlebih untuk "Gabungkan" dan jumlah argumen: "3".Sedikit kurang elegan, tetapi solusi PowerShell murni adalah dengan menggabungkan bagian jalur secara manual:
atau
sumber
Inilah sesuatu yang akan melakukan apa yang Anda inginkan saat menggunakan array string untuk ChildPath.
Output yang mana
Satu-satunya peringatan yang saya temukan adalah bahwa nilai awal $ path harus memiliki nilai (tidak boleh null atau kosong).
sumber
Berikut adalah dua cara lagi untuk menulis fungsi PowerShell murni untuk menggabungkan sejumlah komponen ke dalam jalur.
Fungsi pertama ini menggunakan satu larik untuk menyimpan semua komponen dan kemudian perulangan foreach untuk menggabungkannya:
Karena komponen jalur adalah elemen dalam larik dan semuanya merupakan bagian dari satu argumen, mereka harus dipisahkan dengan koma. Penggunaannya adalah sebagai berikut:
Cara yang lebih minimalis untuk menulis fungsi ini adalah dengan menggunakan
$args
variabel built-in , dan kemudian menutup loop foreach menjadi satu baris menggunakan metode Mike Fair.Tidak seperti versi fungsi sebelumnya, setiap komponen jalur adalah argumen terpisah, jadi hanya diperlukan spasi untuk memisahkan argumen:
sumber
Pendekatan berikut ini lebih ringkas daripada menyisipkan pernyataan Join-Path:
$ p lalu menampung jalur gabungan 'a \ b \ c \ d'.
(Saya baru saja memperhatikan bahwa ini adalah pendekatan yang sama persis dengan Mike Fair, maaf.)
sumber
Atau Anda bisa menulis fungsi Anda sendiri untuk itu (yang akhirnya saya lakukan).
Anda kemudian dapat memanggil fungsi seperti ini:
Ini memiliki keuntungan karena memiliki perilaku yang sama persis dengan fungsi Jalur Gabungan normal dan tidak bergantung pada .NET Framework.
sumber
Anda dapat menggunakannya dengan cara ini:
sumber