J'essaie de créer un chemin de fichier dans PowerShell et la concaténation de chaînes semble être un peu géniale.
J'ai une liste de dossiers:
c:\code\MyProj1
c:\code\MyProj2
Je veux obtenir le chemin vers un fichier DLL ici:
c:\code\MyProj1\bin\debug\MyProj1.dll
c:\code\MyProj2\bin\debug\MyProj2.dll
Voici ce que j'essaie de faire:
$buildconfig = "Debug"
Get-ChildItem c:\code | % {
Write-Host $_.FullName + "\" + $buildconfig + "\" + $_ + ".dll"
}
Ça ne marche pas. Comment puis-je le réparer?
Essaye ça
Get-ChildItem | % { Write-Host "$($_.FullName)\$buildConfig\$($_.Name).dll" }
Dans votre code,
$build-Config
n'est pas un nom de variable valide.$.FullName
devrait être $_.FullName
$
devrait être $_.Name
Vous pouvez utiliser l'équivalent PowerShell de String.Format - c'est généralement le moyen le plus simple de créer 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, puis la liste des variables séparées par des virgules.
Get-ChildItem c:\code|%{'{0}\{1}\{2}.dll' -f $_.fullname,$buildconfig,$_.name}
(J'ai également retiré le tiret du nom de la variable $ buildconfig car j'ai vu que cela causait des problèmes auparavant aussi.)
Essayez l'applet de commande Join-Path:
Get-ChildItem c:\code\*\bin\* -Filter *.dll | Foreach-Object {
Join-Path -Path $_.DirectoryName -ChildPath "$buildconfig\$($_.Name)"
}
Cela obtiendra tous les fichiers dll et les filtres qui correspondent à une expression régulière de votre structure de répertoires.
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