2013-03-11 7 views
5

मैं एक फ़ाइल की सामग्री को खोजने के लिए एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं, और जब यह एक सीआर/एलएफ डालने के लिए ASCII नियंत्रण वर्णों के समूह में आता है।पावरहेल: ASCII नियंत्रण वर्णों का पैटर्न ढूंढें/बदलें

पात्रों के पैटर्न मैं को प्रतिस्थापित करना चाहते हैं [ETX] [NUL] [एसटीएक्स] [ETX] [एसओएच]

 
    $filenames = @(Get-Childitem "E:\VendorFiles\*") 

    $CR = @("[char]3 [char]0 [char]2 [char]3 [char]1") 
    foreach ($file in $filenames) {$outfile = "$file" + ".txt" 
    Get-Content $file | Foreach-object { 
      $_ -replace $CR,"`r`n" ` 
      -replace [char]3,"|" ` 
      -replace [char]1,"{" ` 
      -replace "\\","\\" ` 
     } | Set-Content -encoding "UTF8" $outfile} 

उत्तर

6

यह अभिव्यक्ति:

@("[char]3 [char]0 [char]2 [char]3 [char]1") 

... बनाता है एक एकल तत्व के साथ एक सरणी। यदि आप वास्तव में 5 आइटमों की सरणी चाहते हैं, तो आपको शर्तों के बीच कॉमा की आवश्यकता है, लेकिन -replace किसी भी तरह से सरणी का समर्थन नहीं करता है। साथ ही, आपके एकल तत्व में आपके द्वारा टाइप किए गए शाब्दिक वर्ण शामिल हैं; आप क्या उम्मीद नहीं की।

आपको -replace पर फ़ीड करने के लिए एक सरल स्ट्रिंग बनाने की आवश्यकता है; जब आप गैर-प्रिंट करने योग्य पात्रों से निपट रहे हों तो यह थोड़ा अधिक शामिल होगा। आप सही विचार था - तुम सिर्फ PowerShell बताने के लिए प्रत्येक अभिव्यक्ति पर $() संकेतन का उपयोग कर अपने स्ट्रिंग के भीतर कोड भाव को जोड़ करना होगा:

$CR = "$([char]3)$([char]0)$([char]2)$([char]3)$([char]1)" 
+0

अच्छी तरह से किया गया। Quibble: '-replace' _RHS_ पर केवल arrays का समर्थन नहीं करता है (केवल एक _regex_ समर्थित); हालांकि, _LHS_ - इनपुट स्ट्रिंग - एक सरणी हो सकती है (जिस स्थिति में प्रतिस्थापन ऑपरेशन अलग-अलग सरणी तत्वों पर किया जाता है)। – mklement0

0

मैं एक स्क्रिप्ट है कि कुछ इस तरह करता है में एक समारोह है । सुनिश्चित नहीं हैं कि अगर यह तुम्हारी मदद करेगा:

# This function will make a new file that has custom comments 
# it will comment out "rollback tran" 
# it will uncomment out "--commit tran" 
function CommentAndUncomment($TheScript) 
{ 
    PrintTextAndTime("About to run this SQL file: $TheScript") 
    PrintTextAndTime("Will comment out 'rollback tran' and uncomment '--commit tran'") 
    $content = Get-Content $TheScript 
    $content | 
     ForEach-Object { 
     if ($_ -clike "*ROLLBACK TRAN;*") { 
      $_ -replace "ROLLBACK TRAN;", "--ROLLBACK TRAN;" 
     } 
     elseif ($_ -clike "*--COMMIT TRAN;*") { 
      $_ -replace "--COMMIT TRAN;", "COMMIT TRAN;" 
     } 
     else{ 
      $_ 
     } 
     } | 
     Set-Content $ModifiedCommentsFile 
    echo $ModifiedCommentsFile 
    sqlcmd -i $ModifiedCommentsFile 
    del $ModifiedCommentsFile 
} 
+0

धन्यवाद, लेकिन इससे मदद नहीं मिली। –

1

Michael Sorens' helpful answer अच्छी तरह से अपने दृष्टिकोण के साथ समस्या यह स्पष्ट करता है और एक काम कर समाधान प्रदान करता है।

एक सरल विकल्प की पेशकश करने के लिए:

$CR = ([char[]] (3, 0, 2, 3, 1)) -join '' 
  • 3, 0, 2, 3, 1 पात्रों में से यूनिकोड कोड अंक बनाने के लिए साथ पूर्णांकों की एक सरणी पैदा करता है।

  • कास्ट [char[]] कोड बिंदुओं को वास्तविक वर्णों ([char]) में परिवर्तित करता है।

  • -join '' एक स्ट्रिंग के लिए वर्णों (बिना विभाजक के) के सरणी में शामिल हो जाता है।

+1

धन्यवाद, @ mkelement0, सुधार के लिए! –

संबंधित मुद्दे