none
パスの途中にあるフォルダ名を抽出したい

    質問

  • はじめての投稿になります。よろしくお願いいたします。

    フルパスで記載されたファイルのリストを利用して、ファイルのコピーをしようと思っています。

    コピー先のフォルダもリストのパスを利用して生成したいのですが、ファイルがあるフォルダやパスの途中にある箇所

    (下記の例で言えば、System32)を抽出したいと考えています。

    例)下記のパスのSystem32の箇所

    C:\WINDOWS\System32\drivers\etc\hosts

    C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell_ise.exe.config

    文字列から該当箇所のみ切り出すことも考えましたが、必ずSystem32の箇所とは限らないので、文字数の違いから困難でした。

    \を区切り文字にして、3つ目の項目という共通項はあるので、UNIXのawkのように3列目だけ抽出というのことができれば一番いいのですが、私では力不足でした。

    Split-Pathでは思ったようなことはできなかったのですが、なにかよいお知恵はありますでしょうか。

    よろしくお願いいたします。

    2018年7月2日 2:45

回答

  • やり方は色々あるかと思いますが、一例を挙げます。

    -split演算子を使って、フルパスを指定文字(ここでは"\"ですが、正規表現と見做されるため"\\"とエスケープする)を区切りとして配列化します。

    次にSelect-Objectコマンドレットを使って、最初の2要素(C:とWINDOWS)を飛ばし、最初の要素(System32)を取得します。

    以下に関数化したものを示します。

    function getDestFolderName
    {
        param([string]$Path)
        $Path -split "\\" | Select-Object -Skip 2 -First 1
    }
    
    $name = getDestFolderName "C:\WINDOWS\System32\drivers\etc\hosts"
    2018年7月2日 4:28
    モデレータ
  • $p1 = 'C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell_ise.exe.config'

    $p1.Split('\')[2]

    2018年7月2日 6:57

すべての返信

  • Resolve-Pathはカレントディレクトリからの相対パスを生成する機能があります。

    Push-Location  C:\WINDOWS\System32
    Resolve-Path -Relative C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell_ise.exe.config
    Pop-Location
    

    で .\WindowsPowerShell\v1.0\powershell_ise.exe.config が得られます。

    2018年7月2日 3:20
  • やり方は色々あるかと思いますが、一例を挙げます。

    -split演算子を使って、フルパスを指定文字(ここでは"\"ですが、正規表現と見做されるため"\\"とエスケープする)を区切りとして配列化します。

    次にSelect-Objectコマンドレットを使って、最初の2要素(C:とWINDOWS)を飛ばし、最初の要素(System32)を取得します。

    以下に関数化したものを示します。

    function getDestFolderName
    {
        param([string]$Path)
        $Path -split "\\" | Select-Object -Skip 2 -First 1
    }
    
    $name = getDestFolderName "C:\WINDOWS\System32\drivers\etc\hosts"
    2018年7月2日 4:28
    モデレータ
  • $p1 = 'C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell_ise.exe.config'

    $p1.Split('\')[2]

    2018年7月2日 6:57
  • ありがとうございます。相対パスだけ抽出するコマンドレットがあるのは認識していませんでした・・・

    2018年7月2日 12:35
  • ありがとうございます。

    まさしくこういうことがしたかったので、助かりました。

    2018年7月2日 12:37
  • ありがとうございます。

    まさしくこういうことがしたかったので、助かりました。

    スクリプトに組み込みやすく、ちょうどよいです。

    2018年7月2日 12:38