2012-02-02 32 views
12

tôi có các kịch bản PowerShell sau:Case-nhạy cảm PowerShell thay

$RegExplorer = Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters 
$NullSessionPipes = "$($RegExplorer.NullSessionPipes)" 
$NullSessionPipes 
$NullSessionPipes = $NullSessionPipes.replace("browser", "") 
$NullSessionPipes 

Các kịch bản hoạt động tốt miễn là chìa khóa registry kiểm tra trùng khớp với trường hợp tôi đã chỉ định - "trình duyệt".

Tuy nhiên, nếu trường hợp khác trong khóa đăng ký có nghĩa là "BROWSER" hoặc "Trình duyệt", nó sẽ không thay thế.

Tôi đang tìm một số cách để tạo chuỗi trường hợp không nhạy cảm. Tôi biết tôi có thể chuyển đổi chuỗi bằng cách sử dụng .tolower hoặc .toupper đầu tiên để so sánh dễ dàng hơn nhưng tôi không biết liệu khóa đăng ký cụ thể hoặc ứng dụng truy cập có phân biệt chữ hoa chữ thường hay không vì vậy tôi không muốn thay đổi trường hợp khóa hiện tại .

Có cách nào dễ dàng để thực hiện việc này không?

Cảm ơn Brad

+1

Tôi nghĩ rằng tôi đã tìm ra cách để làm điều này - sau dường như làm việc: $ RegExplorer = Get-ItemProperty -Path HKLM: \ SYSTEM \ CurrentControlSet \ Services \ LanManServer \ parameters $ NullSessionPipes = "$ ($ RegExplorer.NullSessionPipes)" $ NullSessionPipes $ NullSessionPipes = $ NullSessionPipes -ireplace ("BROWSER", "") $ NullSessionPipes – Brad

Trả lời

5

Sử dụng một sự thay thế biểu thức chính quy thay vì:

$RegExplorer = Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters 
$NullSessionPipes = "$($RegExplorer.NullSessionPipes)" 
$NullSessionPipes 
$NullSessionPipes = $NullSessionPipes -replace "browser", "" 
$NullSessionPipes 
+1

regex thay thế có nhược điểm khi tìm kiếm hoặc thay thế của bạn chuỗi có metacharacters regex trong họ ... – Bob

+1

trong trường hợp này là một chuỗi được biết đến tĩnh của nó. Nếu chuỗi tìm kiếm không xác định (một biến), bạn có thể tự động thoát nó bằng cách sử dụng '[regex] :: escape ($ search_string)' –

10

NullSessionPipes là một giá trị đa chuỗi và thay thế phương pháp (ngoài trở case-sensitive) có thể thất bại nếu có nhiều hơn một chuỗi trong đó. Bạn có thể sử dụng toán tử -replace. Theo mặc định, tất cả các toán tử so sánh phân biệt chữ hoa chữ thường. Các toán tử phân biệt chữ hoa chữ thường bắt đầu bằng 'c', như: -replace, -ceq, v.v.

Toán tử bắt đầu bằng 'i' phân biệt chữ hoa chữ thường, như -ireplace, -ieq, và chúng giống như - thay thế, -ieq.

Xem about_Comparison_Operators để biết thêm thông tin.

+0

Thay thế Regex có những hạn chế khi chuỗi tìm kiếm hoặc chuỗi thay thế của bạn có các siêu ký tự regex trong chúng ... – Bob

9

Gọi cho tôi theo ngữ cảnh nhưng trong khi không ai ở đây hoàn toàn sai, không ai cũng cung cấp mã chính xác cho giải pháp cuối cùng.

Bạn cần thay đổi dòng này:

$NullSessionPipes = $NullSessionPipes.replace("browser", "") 

này:

$NullSessionPipes = $NullSessionPipes -ireplace [regex]::Escape("browser"), "" 

Các lạ [regex] văn bản là không thực sự cần thiết miễn là không có ký tự biểu hiện thường xuyên (ví dụ: . * + [](), v.v.) trong chuỗi của bạn. Nhưng bạn an toàn hơn với nó. Cú pháp này làm việc với các biến quá:

$NullSessionPipes = $NullSessionPipes -ireplace [regex]::Escape($stringToReplace), $stringToReplaceItWith 
+1

Đã lưu tôi rất nhiều thời gian. Đã tìm kiếm một cây kim trong một đống cỏ khô và điều này giải quyết nó Thx người đàn ông, thực sự đánh giá cao nó! – DarkLite1

+0

Bạn có thể sử dụng '$ NullSessionPipes = $ NullSessionPipes -ireplace 'browser'," "' - dấu trích dẫn đơn lẻ để kích hoạt cụm từ thông dụng – Marc

+0

Tôi sợ trích dẫn đơn không hủy kích hoạt cụm từ thông dụng, bằng chứng: 'asdf.qwer' -ireplace '.', "X" – Ivan

3

Phương pháp .Replace không có đựng pin- trong lựa chọn nhạy cảm:

String.Replace phương pháp

... Đây phương pháp thực hiện tìm kiếm thứ tự (phân biệt chữ hoa chữ thường và không có văn hóa) ...

https://msdn.microsoft.com/en-us/library/fk49wtc1(v=vs.110).aspx

Những câu trả lời khác cho câu hỏi này đề nghị sử dụng -replace hoặc -ireplace, đó là tốt nếu bạn muốn sử dụng thay thế regex. Tuy nhiên, như @ Bob đề cập đến trong (của mình?) Ý kiến ​​này không phải luôn luôn thích hợp. Ví dụ có thể là nếu bạn muốn bao gồm một chuỗi ký tự như $ _ trong văn bản thay thế.

Một lừa mượn từ case-sensitive nơi khác là chuyển đổi các "đầu vào" chuỗi và chuỗi "tìm kiếm" để giảm trường hợp:

[PS]> "TeXT".ToLower().Replace("text","NewString") 
NewString 

Tuy nhiên ... điều này gây ra đầu ra được trong trường hợp thấp hơn cho bất kỳ thứ gì không khớp với chuỗi tìm kiếm, điều này cũng có thể không được chấp nhận.

[PS]> "DON'T CHANGE MY TeXT".ToLower().Replace("text","NewString") 
don't change my NewString 
Các vấn đề liên quan