2010-10-20 15 views
24

Estoy intentando construir una ruta de archivo en PowerShell y la concatenación de cadenas parece ser un poco cobarde.¿Cómo concateno cadenas con variables en PowerShell?

tengo una lista de carpetas:

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

Quiero obtener la ruta a un archivo DLL aquí:

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

Esto es lo que estoy tratando de hacer:

$buildconfig = "Debug" 

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

Esto no funciona. ¿Cómo puedo arreglarlo?

+4

Tenga cuidado al usar 'Write-Host' - it * only * escribe en la consola del host. No puede capturar ese resultado en una variable. Si simplemente elimina 'Write-Host' y tiene solo la cadena allí, 1) usará implícitamente Write-Output y 2) podrá capturar esa salida a una variable, p. 'gci c: \ code | % {$ _. FullName + "\' $ build-config \ $ ($ _. Basename) \. Dll "' –

Respuesta

26

probar este

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

En su código,

  1. $build-Config no es un nombre de variable válido.
  2. $.FullName debería haber $_.FullName
  3. $ debería ser $_.Name
+0

'$ _. Name' incluye la extensión. Sospecho que la intención era reemplazar la extensión actual con '.dll' en lugar de volver a virar en' .dll' adicional. :-) –

+1

Él dice que tiene una lista de carpetas. Entonces, $ _. El nombre debería estar bien. De lo contrario, $ _. BaseName está bien. – ravikanth

14

podría utilizar el equivalente de PowerShell String.Format - por lo general es la forma más fácil de construir una cadena. Coloque {0}, {1}, etc. donde desee las variables en la cadena, ponga un -f inmediatamente después de la cadena y luego la lista de variables separadas por comas.

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

(También he tomado el tablero de los $ buildconfig nombre de variable como he visto que causa problemas antes también.)

0

Esto hará que todos los archivos DLL y los filtros que coincidan con una expresión regular de su estructura de directorio.

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

Si lo que desea es el camino, no el objeto puede agregar | select fullname a finales de esta manera:

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

6

Prueba el cmdlet Join-Path:

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