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"
}
これは機能しません。どうすれば修正できますか?
これを試して
Get-ChildItem | % { Write-Host "$($_.FullName)\$buildConfig\$($_.Name).dll" }
あなたのコードでは、
$build-Config
は有効な変数名ではありません。$.FullName
は$_.FullName
$
は$_.Name
String.Formatに相当するPowerShellを使用できます。通常は、文字列を作成する最も簡単な方法です。文字列内の変数が必要な場所に{0}、{1}などを配置し、-f
は、文字列の直後、コンマで区切られた変数のリストの直後です。
Get-ChildItem c:\code|%{'{0}\{1}\{2}.dll' -f $_.fullname,$buildconfig,$_.name}
(これまでに問題が発生するのを見てきたので、$ buildconfig変数名からダッシュを削除しました。)
Join-Pathコマンドレットを試してください。
Get-ChildItem c:\code\*\bin\* -Filter *.dll | Foreach-Object {
Join-Path -Path $_.DirectoryName -ChildPath "$buildconfig\$($_.Name)"
}
これにより、すべての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