2013-02-11 39 views
7

Tôi đang sử dụng Get-EventLog để đặt biến và sau đó đặt biến khác với mô tả ID sự kiện. Sau đó tôi sử dụng blat.exe để gửi email thông tin này cho một nhóm.PowerShell: xóa hoặc thay thế dấu trích dẫn từ biến

Mô tả chứa dấu ngoặc kép. Các dấu ngoặc kép đang gây ra blat để thoát với lỗi.

Có cách nào để xóa dấu ngoặc kép khỏi sự kiện này. Hãy thay thế bằng dấu cách hoặc thứ gì đó?

Trả lời

7

Tôi thực sự đã hiểu. Số lượng các dấu ngoặc kép và dấu nháy kép gây nhầm lẫn cho tôi, nhưng điều này đã làm việc và blat đã không lỗi.

$var -replace '"', "" 

Trích dẫn là: đơn, kép, đơn, dấu phẩy, đôi, gấp đôi.

13

Nếu biến là một đối tượng String thì bạn có thể làm như sau:

$Variable.Replace("`"","") 
3

Nếu bạn sử dụng Powershell tích hợp trong send-mailmessage (2.0 yêu cầu), bạn có thể loại bỏ sự phụ thuộc của bạn trên blat.exe và xử lý đúng đắn vấn đề này mà không chỉnh sửa mô tả từ nhật ký sự kiện.

+0

Great điểm. Sẽ xem xét điều đó – Pat

2

Vấn đề là thay thế đơn giản làm sạch mỗi ký tự trích dẫn, ngay cả khi đã thoát (tăng gấp đôi). Dưới đây là các chức năng tôi đã tạo để sử dụng:

  • chỉ xóa một báo giá mồ côi.
  • một mà thoát chúng

Tôi cũng làm cho họ chung để quản lý các nhân vật khác, với tham số charToReplace optionnal $

#Replaces single occurences of characters in a string. 
#Default is to replace single quotes 
Function RemoveNonEscapedChar { 
    param(
     [Parameter(Mandatory = $true)][String] $param, 
     [Parameter(Mandatory = $false)][String] $charToReplace 
    ) 

    if ($charToReplace -eq '') { 
     $charToReplace = "'" 
    } 
    $cleanedString = "" 
    $index = 0 
    $length = $param.length 
    for ($index = 0; $index -lt $length; $index++) { 
     $char = $param[$index] 
     if ($char -eq $charToReplace) { 
      if ($index +1 -lt $length -and $param[$index + 1] -eq $charToReplace) { 
       $cleanedString += "$charToReplace$charToReplace" 
       ++$index ## /!\ Manual increment of our loop counter to skip next char /!\ 
      } 
      continue 
     } 
     $cleanedString += $char 
    } 
    return $cleanedString 
} 
#A few test cases : 
RemoveNonEscapedChar("'st''r'''i''ng'")        #Echoes st''r''i''ng 
RemoveNonEscapedChar("""st""""r""""""i""""ng""") -charToReplace '"' #Echoes st""r""i""ng 
RemoveNonEscapedChar("'st''r'''i''ng'") -charToReplace 'r'   #Echoes 'st'''''i''ng' 


#Escapes single occurences of characters in a string. Double occurences are not escaped. e.g. ''' will become '''', NOT ''''''. 
#Default is to replace single quotes 
Function EscapeChar { 
    param(
     [Parameter(Mandatory = $true)][String] $param, 
     [Parameter(Mandatory = $false)][String] $charToEscape 
    ) 

    if ($charToEscape -eq '') { 
     $charToEscape = "'" 
    } 
    $cleanedString = "" 
    $index = 0 
    $length = $param.length 
    for ($index = 0; $index -lt $length; $index++) { 
     $char = $param[$index] 
     if ($char -eq $charToEscape) { 
      if ($index +1 -lt $length -and $param[$index + 1] -eq $charToEscape) { 
       ++$index ## /!\ Manual increment of our loop counter to skip next char /!\ 
      } 
      $cleanedString += "$charToEscape$charToEscape" 
      continue 
     } 
     $cleanedString += $char 
    } 
    return $cleanedString 
} 
#A few test cases : 
EscapeChar("'st''r'''i''ng'")        #Echoes ''st''r''''i''ng'' 
EscapeChar("""st""""r""""""i""""ng""") -charToEscape '"' #Echoes ""st""r""""i""ng"" 
EscapeChar("'st''r'''i''ng'") -charToEscape 'r'   #Echoes 'st''rr'''i''ng' 
0

Không ai trong số các câu trả lời ở trên làm việc cho tôi. Vì vậy, tôi đã tạo ra giải pháp sau đây ...

Tìm kiếm và Thay thế các ký tự đơn Trích "'" ascii nhân vật (39) với một không gian "" ascii nhân vật (32)

$strOldText = [char] 39 
$strNewText = [char] 32 

$Variable. = $Variable..Replace($strOldText, $strNewText).Trim() 
+0

Câu hỏi này đã được trả lời 4 năm trước. Điều đó nói rằng, câu trả lời mới của bạn không cung cấp ngữ cảnh.Bạn có thể vui lòng chỉnh sửa và giải thích những gì bạn đang nói về? – Pat

+0

Sẽ vô ích khi cố gắng cung cấp câu trả lời tốt hơn/thay thế, nếu câu hỏi này không được tìm kiếm hoặc mở trong 4 năm qua. Trim() thực sự là phương pháp dành cho các ký tự "cắt tỉa" từ đầu/cuối của chuỗi. Nó vẫn không hoàn hảo trong trường hợp này, vì cũng có phiên bản quá tải phù hợp hơn Trim (Char []). Đơn giản và sẽ không xóa dấu ngoặc kép thoát khỏi bên trong chuỗi và khoảng trắng dự định có thể có. Kiểm tra câu trả lời của tôi. – papo

0

đơn giản, sử dụng Trim(Char[]) method:
... Loại bỏ tất cả ở đầu và đuôi lần xuất hiện ...

e.g. $your_variable.Trim('"') 

nó sẽ giữ bất kỳ dấu ngoặc kép, thoát hay không, bên trong một chuỗi tại chỗ:

PS C:\> $v.Trim('"') # where $v is: "hu""hu"hu'hu" 
hu""hu"hu'hu 

để tận trong tâm trí, nó cũng sẽ loại bỏ mồ côi nháy kép:

PS C:\> $v.Trim('"') # where $v is: "hu""hu"hu'hu 
hu""hu"hu'hu 
Các vấn đề liên quan