web-dev-qa-db-ja.com

PowerShellで文字列を変数と連結するにはどうすればよいですか?

PowerShellでファイルパスを作成しようとしていますが、文字列の連結は少しファンキーなようです。

フォルダのリストがあります:

c:\code\MyProj1
c:\code\MyProj2

ここでDLLファイルへのパスを取得したい:

c:\code\MyProj1\bin\debug\MyProj1.dll
c:\code\MyProj2\bin\debug\MyProj2.dll

これが私がやろうとしていることです:

$buildconfig = "Debug"

Get-ChildItem c:\code | % {
    Write-Host $_.FullName + "\" + $buildconfig + "\" + $_ + ".dll"
}

これは機能しません。どうすれば修正できますか?

24
Micah

これを試して

Get-ChildItem  | % { Write-Host "$($_.FullName)\$buildConfig\$($_.Name).dll" }

あなたのコードでは、

  1. $build-Configは有効な変数名ではありません。
  2. $.FullName$_.FullName
  3. $$_.Name
27
ravikanth

String.Formatに相当するPowerShellを使用できます。通常は、文字列を作成する最も簡単な方法です。文字列内の変数が必要な場所に{0}、{1}などを配置し、-fは、文字列の直後、コンマで区切られた変数のリストの直後です。

Get-ChildItem c:\code|%{'{0}\{1}\{2}.dll' -f $_.fullname,$buildconfig,$_.name}

(これまでに問題が発生するのを見てきたので、$ buildconfig変数名からダッシュを削除しました。)

14
craika

Join-Pathコマンドレットを試してください。

Get-ChildItem c:\code\*\bin\* -Filter *.dll | Foreach-Object {
    Join-Path -Path  $_.DirectoryName -ChildPath "$buildconfig\$($_.Name)" 
}
6
Shay Levy

これにより、すべてのdllファイルが取得され、ディレクトリ構造の正規表現に一致するファイルがフィルタリングされます。

Get-ChildItem C:\code -Recurse -filter "*.dll" | where { $_.directory -match 'C:\\code\\myproj.\\bin\\debug'}

オブジェクトではなくパスだけが必要な場合は、次のように| select fullnameを最後に追加できます。

Get-ChildItem C:\code -Recurse -filter "*.dll" | where { $_.directory -match 'C:\\code\\myproj.\\bin\\debug'} | select fullname

0
Jacob Ballard