Ответ 1
Попробуйте это
Get-ChildItem | % { Write-Host "$($_.FullName)\$buildConfig\$($_.Name).dll" }
В вашем коде
-
$build-Config
не является допустимым именем переменной. -
$.FullName
должен быть$_.FullName
-
$
должен быть$_.Name
Я пытаюсь создать путь к файлу в 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
Вы можете использовать эквивалент PowerShell для String.Format - обычно это самый простой способ создать строку. Место {0}, {1} и т.д., Где вы хотите переменные в строке, поместите a -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