2010-10-20 7 views
24

J'essaye de construire un chemin de fichier dans PowerShell et la concaténation de chaîne semble être un peu géniale.Comment concaténer des chaînes avec des variables dans PowerShell?

J'ai une liste de dossiers:

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

Je veux obtenir le chemin d'un fichier DLL ici:

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

Voici ce que je suis en train de faire:

$buildconfig = "Debug" 

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

Cela ne fonctionne pas. Comment puis-je le réparer?

+4

Faites attention à l'utilisation de Write-Host - c'est uniquement * écrit sur la console hôte. Vous ne pouvez pas capturer cette sortie dans une variable. Si vous enlevez simplement 'Write-Host' et que vous n'avez que la chaîne qui s'y trouve, cela va 1) utiliser implicitement Write-Output et 2) vous pourrez capturer cette sortie dans une variable, par exemple. 'gci c: \ code | % {$ _. FullName + "\' $ build-config \ $ ($ _. Basename) \. Dll "' –

Répondre

26

Essayez cette

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

Dans votre code,

  1. $build-Config est pas un nom de variable valide.
  2. $.FullName devrait être $_.FullName
  3. $ devrait être $_.Name
+0

'$ _. Name' inclut l'extension. Je soupçonne que l'intention était de remplacer l'extension actuelle par '.dll' au lieu de virer sur un '.dll' supplémentaire. :-) –

+1

Il dit qu'il a une liste de dossiers. Donc, $ _. Nom devrait être OK. Sinon, $ _. BaseName est OK. – ravikanth

14

Vous pouvez utiliser l'équivalent PowerShell de String.Format - il est généralement la meilleure façon de construire une chaîne. Placez {0}, {1}, etc. où vous voulez les variables dans la chaîne, mettez un -f immédiatement après la chaîne et ensuite la liste des variables séparées par des virgules.

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

(j'ai aussi pris le tableau de bord à partir du nom variable buildconfig de $ comme je l'ai vu qui cause les problèmes avant aussi.)

0

Cela obtenir tous les fichiers dll et les filtres qui correspondent à une expression régulière de votre structure de répertoire.

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

Si vous voulez juste le chemin, pas l'objet que vous pouvez ajouter | select fullname à la fin comme ceci:

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

6

Essayez l'applet de commande Join-Path:

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