2010-10-20 32 views
24

Tôi đang cố gắng xây dựng đường dẫn tệp trong PowerShell và chuỗi nối có vẻ hơi sôi nổi.Làm cách nào để nối các chuỗi với các biến trong PowerShell?

Tôi có danh sách các thư mục:

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

Tôi muốn nhận được đường dẫn đến một tập tin DLL đây:

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

đây của những gì tôi đang cố gắng để làm:

$buildconfig = "Debug" 

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

Điều này không hoạt động. Làm thế nào tôi có thể sửa chữa nó?

+4

Hãy cẩn thận khi sử dụng 'Write-Host' - nó * only * ghi vào bảng điều khiển máy chủ. Bạn không thể nắm bắt đầu ra đó thành một biến. Nếu bạn chỉ cần xóa 'Write-Host' và chỉ có chuỗi đang ngồi ở đó, nó sẽ 1) ngầm sử dụng Write-Output và 2), bạn sẽ có thể nắm bắt đầu ra đó thành một biến, ví dụ: 'gci c: \ code | % {$ _. FullName + "\' $ build-config \ $ ($ _. Basename) \. Dll "' –

Trả lời

26

Hãy thử điều này

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

Trong code của bạn,

  1. $build-Config không phải là một tên biến hợp lệ.
  2. $.FullName nên $_.FullName
  3. $ nên $_.Name
+0

'$ _. Tên' bao gồm phần mở rộng. Tôi nghi ngờ ý định là thay thế phần mở rộng hiện tại bằng '.dll' thay vì tacking trên' .dll' bổ sung. :-) –

+1

Anh ta nói anh ta có một danh sách các thư mục. Vì vậy, $ _. Tên nên được OK. Nếu không, $ _. BaseName là OK. – ravikanth

14

Bạn có thể sử dụng tương đương với PowerShell của String.Format - nó thường là cách dễ nhất để xây dựng một chuỗi. Đặt {0}, {1}, v.v. trong đó bạn muốn các biến trong chuỗi, đặt -f ngay sau chuỗi và sau đó là danh sách các biến được phân tách bằng dấu phẩy.

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

(Tôi cũng đưa ra những dấu gạch ngang ra khỏi tên $ buildconfig biến như tôi đã thấy rằng gây ra các vấn đề trước khi quá.)

0

này sẽ nhận được tất cả các file dll và những bộ lọc phù hợp với một regex của cấu trúc thư mục của bạn.

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

Nếu bạn chỉ muốn con đường, không phải là đối tượng bạn có thể thêm | select fullname đến cuối như thế này:

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

6

Hãy thử cmdlet Tham-Path:

Get-ChildItem c:\code\*\bin\* -Filter *.dll | Foreach-Object { 
    Join-Path -Path $_.DirectoryName -ChildPath "$buildconfig\$($_.Name)" 
} 
Các vấn đề liên quan