0

MSBuild にはGetDirectoryNameOfFileAboveプロパティ関数があります。

PowerShell で同じことを達成するにはどうすればよいですか?

インクルードを見つけるためにすべてのエントリポイントスクリプトに貼り付ける必要があるため、コンパクトな構文を使用する必要があります。


この質問の考え方:

  • ソース コード管理には大きな解決策があります。その一部の部分は比較的自律的です。
  • ルートの下の既知のフォルダーに、共有スクリプトと再利用可能な関数の場所があります。
  • プロジェクトには多数のエントリポイント スクリプト (明示的に実行するファイル) が散らばっており、そのすべてに共有スクリプトが含まれています。
  • entry-point-script から共有スクリプトを見つける便利な方法は何ですか?

相対パスは のように見えるため、うまく機能しないことが判明しました"../../../../../../scripts/smth"

モジュールの登録は、(a) インストールではなく SCC から取得するため、適切なオプションではありません。(b) 通常、異なるディスクの場所に異なるバージョンがすべて同時に存在し、(c) これはモジュールへの過剰な依存関係です。技術的にはローカル情報だけで十分な環境。


これを行うための MSBuild の方法 (v4 以降) は次のとおりです。マーカー ファイル (たとえば、root.here など) をドロップし、そのフォルダーへの絶対パスを取得しますGetDirectoryNameOfFileAbove。パスを構築するためのローカル ルートを取得しました。

多分それはpowershellを使う正しい方法ではないので、そのような指示にも感謝します.

4

2 に答える 2

1

次のようにして、現在のフォルダーにアクセスできます。 $invoker= Split-Path -Parent $MyInvocation.MyCommand.Path

したがって、その親は次のとおりです。 $parent=Split-Path -Parent $MyInvocation.MyCommand.Path|Split-Path -Parent

于 2013-02-01T09:37:54.280 に答える
0

手っ取り早い解決策は次のようになります。

function GetDirectoryNameOfFileAbove($markerfile)
{
    $result = ""
    $path = $MyInvocation.ScriptName
    while(($path -ne "") -and ($path -ne $null) -and ($result -eq "")) 
    { 
        if(Test-Path $(Join-Path $path $markerfile)) {$result=$path}
        $path = Split-Path $path 
    }
    if($result -eq "") {throw "Could not find marker file $markerfile in parent folders."}
    return $result
}

スクリプトに埋め込むために 1 行に圧縮することもできますが、それでも C# っぽいので、PS パイプ/LINQ スタイルの魔法を使って短くすることができると思います。

UPD: スクリプトを編集しました。スクリプト$MyInvocation.MyCommand.Pathがコマンドラインからドットソーシング (任意のコンテキスト レベル) で呼び出されると、多くの場合 NULL であることが判明したため、現在の仮説はScriptName.

于 2013-01-30T14:41:08.593 に答える