2012-03-02 17 views
6

Câu trả lời cho điều này có thể là tầm thường, nhưng tôi đã dành nửa giờ và vẫn không thể làm việc.Định dạng chuỗi Powershell có chứa các giá trị Hashtable

Giả sử tôi có một Hashtable sau:

$hash = @{face='Off';} 

Những gì tôi đã cố gắng để làm, là đầu ra giá trị của "khuôn mặt" bên cạnh một số yếu tố chuỗi khác.

này hoạt động:

Write-Host Face $hash['face'] 
=> Face Off 

Tuy nhiên, đây không:

Write-Host Face/$hash['face'] 
=> Face/System.Collections.Hashtable[face] 

Bằng cách nào đó thiếu một không gian đã ảnh hưởng đến ưu tiên điều hành - nó bây giờ đang đánh giá $ băm như là một chuỗi, [mặt] nối sau đó.

Đang cố gắng để giải quyết vấn đề ưu tiên này, tôi đã cố gắng:

Write-Host Face/($hash['face']) 
=> Face/ Off 

bây giờ tôi có một không gian thêm tôi không muốn. này hoạt động, nhưng tôi không muốn dòng thêm chỉ để phân công lại:

$hashvalue = $hash['face'] 
write-host Face/$hashvalue 
=> Face/Off 

Bất kỳ ý tưởng làm thế nào để làm việc này như một lớp lót?

Trả lời

9

Chắc chắn, sử dụng một subexpression:

Write-Host Face/$($hash['face']) 

Nói chung, tôi muốn chỉ cần sử dụng một chuỗi, nếu tôi cần điều khiển chính xác khoảng trắng với Write-Host:

Write-Host "Face/$($hash['face'])" 

Có, trong này trường hợp bạn cần một biểu thức con một lần nữa, nhưng nhiều hơn vì bạn chỉ đơn giản là không thể bao gồm một biểu thức như $foo['bar'] trong một chuỗi khác ;-)

Bằng cách này, $hash.face cũng hoạt động tốt với sự lộn xộn thị giác ít hơn nhiều.

+0

Các subexpression là chìa khóa ở đây (kèm theo trong $()). Tôi đã nhận thức được mơ hồ về vai trò của họ, nhưng đã bỏ lỡ khả năng áp dụng ở đây. – llevera

+0

Không được chấp nhận để cho người khác cơ hội trả lời. Có một chút nhanh chóng tắt các khối – llevera

3

Trong những trường hợp như vậy, và nhiều hơn nữa nếu có nhiều biến liên quan, tôi thích sử dụng định dạng chuỗi hơn. Trong khi trong trường hợp này bạn có thể sống với $(..), lưu ý rằng chuỗi định dạng sẽ loại bỏ rất nhiều sự nghi ngờ, cruft và cải thiện khả năng đọc:

write-host ("Face/{0}" -f $hash['face']) 
+0

Cảm ơn bạn đã chỉ ra tùy chọn -f. Tôi chưa bao giờ sử dụng điều đó, và tôi chắc chắn có thể thấy nó sẽ làm cho các kịch bản phức tạp hơn nhiều như thế nào dễ quản lý hơn – llevera

+1

llevera, nó là một toán tử, không phải là một lựa chọn. – Joey

1

Ngoài việc sử dụng biểu thức phụ như Joey cho thấy bạn có thể:

sử dụng chuỗi định dạng:

Write-Host ('Face/{0}' -f $hash.face) 

này sẽ dính vào giá trị của chính mặt tại địa điểm của {0}

sử dụng nối chuỗi:

Write-Host ('Face/' + $hash.face) 

Cả hai của những người đòi hỏi một biểu thức được đánh giá mà kết quả đầu ra một chuỗi được sử dụng như Object tham số Write-Host 's.

+0

Tôi nghĩ rằng đáng chú ý là đối với ví dụ Write-Host ('Face /' + $ hash.face), các dấu ngoặc là quan trọng. Nếu không có chúng, dấu + sẽ được coi là chuỗi ký tự. Định dạng chuỗi Powershell mất một chút làm quen với! – llevera

+0

@llevera Yea các parens nói PowerShell để thực hiện chuỗi nối đầu tiên. Đầu ra là một đối tượng System.String được sử dụng như giá trị tham số 'Write-Host -Object'. –

0

lựa chọn khác là để chèn dấu gạch chéo của bạn với các tùy chọn -Separator của Write-Host:

$hash = @{Face="off"} 
Write-Host ("Face",$hash.Face) -Separator '/'