2016-08-31 9 views
0

現在の作業ディレクトリを$ dp0に取得する方法が見つかりました。変数をパラメータとして使用すると、変数のソースを使用できない

PS C:\src\powershell> Get-Content .\curdir2.ps1 
$dp0 = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition) 

Set-Location -Path $dp0 
Write-Host "location is set" 

Set-Location -Path [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition) 

Write-Host (Get-Location).Path 

は、なぜそれが私がSet-Locationにパラメータと同じ方法を使用しようとすると、それは誤りであるということですか?私はこれがPowerShellのオブジェクトに関する基本的なものかもしれないと思います。私は何を知る必要がありますか?

Set-Location : A positional parameter cannot be found that accepts argument 'C:\src\powershell\curdir2.ps1'. 
At C:\src\powershell\curdir2.ps1:6 char:1 
+ Set-Location -Path [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.De ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Set-Location], ParameterBindingException 
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetLocationCommand 

答えて

2

括弧を使用してください。
PS ISEでわかるように、パラメータ全体はリテラル文字列として解釈されます。
[]の角かっこでディレクトリを正しく処理するには、-Pathの代わりに常に-LiteralPathを使用してください。

Set-Location -LiteralPath ([IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)) 

PS3.0 +:cd -LiteralPath $PSScriptRoot

+0

私はあなたにチェックマークを与えています。あなたはカッコが必要な理由についてもっと何か言えますか?私は他の言語でそれを見たことはないと思う。 – lit

+1

PowerShellの構文は、引用符で囲まれていないテキストを 'string'や' string [] '(文字列の配列)型の文字列として扱うため、非常に奇妙です。文字列の中と同様に、変数 '$ var'と式' $(....) 'だけを認識します。裸のかっこは基本的に引用符を使用しないときの後者の省略形です。 – wOxxOm

関連する問題