2010-10-20 6 views
24

Ich versuche, einen Dateipfad in PowerShell zu erstellen, und die Zeichenfolge-Verkettung scheint ein wenig funky zu sein.Wie verkette ich Zeichenfolgen mit Variablen in PowerShell?

Ich habe eine Liste von Ordnern:

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

Ich möchte hier den Pfad zu einer DLL-Datei erhalten:

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

Hier ist, was ich versuche zu tun:

$buildconfig = "Debug" 

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

Dies funktioniert nicht. Wie kann ich es reparieren?

+4

Achten Sie darauf, 'Write-Host' zu verwenden - es wird nur * in die Host-Konsole geschrieben. Sie können diese Ausgabe nicht in einer Variablen erfassen. Wenn Sie 'Write-Host' einfach entfernen und nur die Zeichenfolge dort haben, wird 1) implizit Write-Output verwendet und 2) Sie können diese Ausgabe auf eine Variable z. 'gci c: \ code | % {$ _. FullName + "\ $ $ build-config \ $ ($ _. Basisname) \. Dll" ' –

Antwort

26

Versuchen Sie, diese

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

in Ihrem Code

  1. $build-Config keine gültige Variablenname ist.
  2. $.FullName sollte $_.FullName sein
  3. $$_.Name
+0

' $ _. Name' enthält die Erweiterung. Ich vermute, dass die Absicht darin bestand, die aktuelle Erweiterung durch '.dll' zu ersetzen, statt auf eine zusätzliche' .dll' zu klicken. :-) –

+1

Er sagt, er hat eine Liste von Ordnern. Also, $ _. Name sollte OK sein. Andernfalls ist $ _. BaseName OK. – ravikanth

14

sollten Sie die Powershell-Äquivalent von String.Format verwenden könnte - es ist in der Regel der einfachste Weg, um eine Zeichenfolge aufzubauen. Platzieren Sie {0}, {1} usw., wo die Variablen in der Zeichenfolge stehen sollen, setzen Sie unmittelbar hinter der Zeichenfolge eine -f und dann die Liste der Variablen durch Kommas getrennt.

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

(ich auch den Bindestrich aus dem $ buildconfig Variablennamen genommen haben, wie ich, die Probleme gesehen, bevor auch verursacht.)

0

Dadurch werden alle DLL-Dateien und Filter diejenigen erhalten, die einen regulären Ausdruck übereinstimmen Ihrer Verzeichnisstruktur.

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

Wenn Sie nur den Pfad wollen, nicht das Objekt, das Sie | select fullname bis zum Ende wie folgt hinzufügen:

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

6

des Cmdlets Join-Path Versuchen:

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