Подтвердить что ты не робот

Как конкатенировать строки с переменными в 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"
}

Это не работает. Как я могу это исправить?

4b9b3361

Ответ 1

Попробуйте это

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

В вашем коде

  • $build-Config не является допустимым именем переменной.
  • $.FullName должен быть $_.FullName
  • $ должен быть $_.Name

Ответ 2

Вы можете использовать эквивалент PowerShell для String.Format - обычно это самый простой способ создать строку. Место {0}, {1} и т.д., Где вы хотите переменные в строке, поместите a -f сразу после строки, а затем список переменных, разделенных запятыми.

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

(Я также взял тире из имени переменной $buildconfig, как я уже видел, что также вызывает проблемы.)

Ответ 3

Попробуйте командлет Join-Path:

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

Ответ 4

Это позволит получить все файлы 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