{"id":433,"date":"2021-05-08T10:00:00","date_gmt":"2021-05-08T08:00:00","guid":{"rendered":"https:\/\/pascal-korz.de\/blog\/?p=433"},"modified":"2021-04-17T21:34:34","modified_gmt":"2021-04-17T19:34:34","slug":"powershell-fallen-3-dateipfade-verbinden","status":"publish","type":"post","link":"https:\/\/pascal-korz.de\/blog\/2021\/05\/08\/powershell-fallen-3-dateipfade-verbinden\/","title":{"rendered":"PowerShell-Fallen #3: Dateipfade verbinden"},"content":{"rendered":"\n<p>Irgendwann muss jeder einmal zwei oder mehr Strings zu einem Dateipfad zusammenf\u00fchren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nicht optimal: +<\/h2>\n\n\n\n<p>Wenn es einmal schnell gehen soll, kann man sie nat\u00fcrlich immer mit dem Additionsoperator verbinden, aber leider wird dabei nicht \u00fcberpr\u00fcft, ob das Ergebnis wirklich ein g\u00fcltiger Pfad ist:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"C:\" + \"Windows\"\n\nOutput:\nC:Windows<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Join-Path \u2026 und seine Nachteile<\/h2>\n\n\n\n<p>Der Befehl <code>Join-Path<\/code> ist genau daf\u00fcr gemacht und erf\u00fcllt seinen Zweck:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Join-Path -Path \"C:\" -ChildPath \"Windows\"\n\nOutput:\nC:\\Windows<\/code><\/pre>\n\n\n\n<p>Doch <code>Join-Path<\/code> \u00fcberrascht mit einigen Limitationen. Erst seit PowerShell 6.0 beherrscht es das Verbinden von mehr als zwei Pfaden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Join-Path -Path \"C:\" -ChildPath \"Windows\" -AdditionalChildPaths \"Drivers\", \"etc\", \"hosts\"\n\nOutput:\nC:\\Windows\\Drivers\\etc\\hosts<\/code><\/pre>\n\n\n\n<p>Oder k\u00fcrzer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Join-Path \"C:\", \"Windows\", \"Drivers\", \"etc\", \"hosts\"\n\nOutput:\nC:\\Windows\\Drivers\\etc\\hosts<\/code><\/pre>\n\n\n\n<p>Wenn aber nun ein Pfad gebaut werden soll, der mit einem Laufwerksbuchstaben beginnt, den das System nicht kennt, wird man mit einer Fehlermeldung konfrontiert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Join-Path -Path \"A:\" -ChildPath \"Windows\"\n\nOutput:\nJoin-Path: Cannot find drive. A drive with the name 'A' does not exist.<\/code><\/pre>\n\n\n\n<p><code>Join-Path<\/code> ist in den meisten F\u00e4llen ausreichend, aber nicht so m\u00e4chtig wie zum Beispiel <code>os.path.join<\/code> in Python.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Besser: IO.Path<\/h2>\n\n\n\n<p>Die .NET-Klasse <code>System.IO.Path<\/code> bietet eine <code>Combine<\/code>-Methode an, die keine der oben genannten Nachteile birgt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;System.IO.Path]::Combine(\"C:\", \"Windows\", \"Drivers\", \"etc\", \"hosts\")\n\nOutput:\nC:\/Windows\/Drivers\/etc\/hosts<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Irgendwann muss jeder einmal zwei oder mehr Strings zu einem Dateipfad zusammenf\u00fchren. Nicht optimal: + Wenn es einmal schnell gehen soll, kann man sie nat\u00fcrlich immer mit dem Additionsoperator verbinden, aber leider wird dabei nicht \u00fcberpr\u00fcft, ob das Ergebnis wirklich ein g\u00fcltiger Pfad ist: Join-Path \u2026 und seine Nachteile Der Befehl Join-Path ist genau daf\u00fcr&hellip; <a class=\"more-link\" href=\"https:\/\/pascal-korz.de\/blog\/2021\/05\/08\/powershell-fallen-3-dateipfade-verbinden\/\"><span class=\"screen-reader-text\">PowerShell-Fallen #3: Dateipfade verbinden<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":6,"featured_media":429,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-433","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell","entry"],"_links":{"self":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/433","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/comments?post=433"}],"version-history":[{"count":3,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/433\/revisions"}],"predecessor-version":[{"id":437,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/433\/revisions\/437"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/media\/429"}],"wp:attachment":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/media?parent=433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/categories?post=433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/tags?post=433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}