1

psake を使用してビルド スクリプトを作成しています。現在の作業ディレクトリから、相対パスまたは絶対パスのいずれかの入力パスを使用して絶対パスを作成する必要があります。

現在地がC:\MyProject\Build

$outputDirectory = Get-Location | Join-Path -ChildPath ".\output"

これはひどいC:\MyProject\Build\.\outputものではありませんが、なしでお願いし.\ます。を使用することでその問題を解決できPath.GetFullPathます。

絶対パスを提供できるようにしたいときに問題が発生します

$outputDirectory = Get-Location | Join-Path -ChildPath "\output"

代わりC:\MyProject\Build\outputに必要な場所に を与えます。C:\output

$outputDirectory = Get-Location | Join-Path -ChildPath "F:\output"

代わりC:\MyProject\Build\F:\outputに必要な場所に を与えます。F:\output

を使用してみResolve-Pathましたが、これは常にパスが存在しないと不平を言います。

Join-Path使用するコマンドレットではないと思いますが、やりたいことを行う方法に関するリソースを見つけることができませんでした。私が必要とすることを達成するための簡単な一行はありますか?

4

2 に答える 2

2

を使用できますGetFullPath()が、「ハック」を使用して現在の場所を現在のディレクトリとして使用する必要があります(相対パスを解決するため)。修正プログラムを使用する前は、.NET メソッドの現在のディレクトリはプロセスの作業ディレクトリであり、PowerShell プロセス内で指定した場所ではありません。PowerShell の .NET オブジェクトが現在のディレクトリを使用しないのはなぜですか?を参照してください。

#Hack to make .Net methods use the shells current directory instead of the working dir for the process
[System.Environment]::CurrentDirectory = (Get-Location)
".\output", "\output", "F:\output" | ForEach-Object {
    [System.IO.Path]::GetFullPath($_)
}

出力:

C:\Users\Frode\output
C:\output
F:\output

このようなものがうまくいくはずです:

#Hack to make .Net methods use the shells current directory instead of the working dir for the process
[System.Environment]::CurrentDirectory = (Get-Location)

$outputDirectory = [System.IO.Path]::GetFullPath(".\output")
于 2015-03-21T23:24:01.537 に答える
2

単純なワンライナーはないと思います。しかし、まだ存在しない場合は、パスを作成する必要があると思いますか? では、なぜそれをテストして作成しないのでしょうか?

cd C:\
$path = 'C:\Windows', 'C:\test1', '\Windows', '\test2', '.\Windows', '.\test3'

foreach ($p in $path) {
    if (Test-Path $p) {
        (Get-Item $p).FullName
    } else {
        (New-Item $p -ItemType Directory).FullName
    }
}
于 2015-03-21T23:34:21.083 に答える