2010-10-20 86 views
24

我想在PowerShell中建立一個文件路徑,並且字符串連接似乎有點時髦。如何在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" 
} 

這不起作用。我該如何解決它?

+4

小心使用'寫主機' - 它*只*寫入主機控制檯。您無法將該輸出捕獲到變量中。如果你只是簡單地刪除'Write-Host'並只讓字符串坐在那裏,它將會隱式地使用Write-Output和2)你將能夠將該輸出捕獲到一個變量,例如, 'gci c:\ code | %{$ _。FullName +「\'$ build-config \ $($ _。basename)\。dll」' – 2010-10-20 14:33:20

回答

26

試試這個

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

在你的代碼,

  1. $build-Config是不是一個有效的變量名。
  2. $.FullName應該$_.FullName
  3. $應該$_.Name
+0

'$ _。Name'包含擴展名。我懷疑目的是用'.dll'替換當前的擴展名,而不是添加額外的'.dll'。 :-) – 2010-10-20 14:35:15

+1

他說他有一個文件夾列表。所以,$ _。名稱應該可以。否則,$ _。BaseName是可以的。 – ravikanth 2010-10-20 14:50:37

14

你可以使用PowerShell的等價物的String.Format的 - 它通常是建立一個字符串的最簡單的方法。將{0},{1}等放在字符串中需要變量的位置,在字符串後面緊跟一個-f,然後用逗號分隔變量列表。

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

(我也採取了衝出,以前也發生問題的原因,因爲我已經看到了$ buildconfig變量名。)

0

這將讓所有的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

6

嘗試加入路徑cmdlet:

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