2016-08-19 4 views
2

Я довольно новыми для Powershell сценариев, так что простите меня, если код и/или объяснение неаккуратно. Я пытаюсь создать сценарий, который открывает электронную таблицу Excel и заменяет все специальные буквы (æöý и т. Д.) Стандартными символами. Теперь скрипт работает, но получается все символы верхнего регистра в таблице в нижний регистр символов (например. «Ольборг» становится «Alborg»), который я предпочел бы, если бы он не сделал. Я был убежден, что метод .replace чувствителен к регистру, хотя, похоже, это не так.Powershell и Excel, чувствительность к регистру с .Привернуть

Теперь я попробовал несколько вещей, двойные кавычки вместо одинарные, и двойные, и одиночные кавычки, -creplace вместо .Привернуть который просто выплевывает

System.__ComObject 

фактически не меняя ничего в таблица (я думаю, что $ objRange является массивом, является то, что почему?), добавив .Привернуть и для прописных и строчных букв, но ничего не работает. Любой, кто может указать на мою ошибку?

Код:

$excelFile = New-Object system.windows.forms.openfiledialog 
$excelFile.InitialDirectory = 'Q:\Address_convert' 
$excelFile.MultiSelect = $false 
$excelFile.showdialog() 
$excelFile.filenames 

$excelFile = $excelFile -replace "System.Windows.Forms.OpenFileDialog: Title: , FileName: ", "" 

if ($excelFile -like '*.xlsx*') { 

    $excel = New-Object -comObject Excel.Application 
    $excel.Visible = $false 
    $excel.DisplayAlerts = $false 

$workBook = $excel.WorkBooks.Open($excelFile) 

$oReturn = [Microsoft.VisualBasic.Interaction]::MsgBox("Replace special characters in $excelFile ?", 'YesNo,MsgBoxSetForeground,Question', 'Address Replace') 
switch ($oReturn){ 
"Yes" { 
    For($i = 1 ; $i -le $workBook.Sheets.count ; $i++) 
    { 
     $workSheet = $workBook.Sheets.item($i) 
     $objRange = $workSheet.UsedRange 
     $objRange.Replace('á', 'a')   
     $objRange.Replace('à', 'a') 
     $objRange.Replace('â', 'a') 
     $objRange.Replace('ã', 'a') 
     $objRange.Replace('ä', 'a') 
     $objRange.Replace('å', 'a') 
     $objRange.Replace('æ', 'ae') 
     $objRange.Replace('ç', 'c') 
     $objRange.Replace('é', 'e') 
     $objRange.Replace('è', 'e') 
     $objRange.Replace('ê', 'e') 
     $objRange.Replace('ë', 'e') 
     $objRange.Replace('í', 'i') 
     $objRange.Replace('ì', 'i') 
     $objRange.Replace('î', 'i') 
     $objRange.Replace('ï', 'i') 
     $objRange.Replace('ð', 'd') 
     $objRange.Replace('ð', 'd') 
     $objRange.Replace('ñ', 'n') 
     $objRange.Replace('ó', 'o') 
     $objRange.Replace('ò', 'o') 
     $objRange.Replace('ô', 'o') 
     $objRange.Replace('õ', 'o') 
     $objRange.Replace('ö', 'o') 
     $objRange.Replace('ø', 'o') 
     $objRange.Replace('ú', 'u') 
     $objRange.Replace('ù', 'u') 
     $objRange.Replace('û', 'u') 
     $objRange.Replace('ü', 'u') 
     $objRange.Replace('ý', 'y') 
     $objRange.Replace('ÿ', 'y') 
     $objRange.Replace('ß', 'ss') 
     $objRange.Replace('þ', 'th') 
    } 
    if (!$workBook.saved) {$workBook.save()} 
    $workBook.close() 

    [Microsoft.VisualBasic.Interaction]::MsgBox("Replacement completed", 'OkOnly,MsgBoxSetForeground,Information', 'Address Replace') 
} 
"No" { 
    if (!$workBook.saved) {$workBook.save()} 
    $workBook.close() 

    [Microsoft.VisualBasic.Interaction]::MsgBox("Replacement aborted!", 'OkOnly,MsgBoxSetForeground,Exclamation', 'Address Replace') 
    } 
    } 
} 
Else {[Microsoft.VisualBasic.Interaction]::MsgBox("Specified path ($excelFile) does not contain an .xlsx file!", 'OkOnly,MsgBoxSetForeground,Exclamation', 'Address Replace')} 
+1

Что произойдет, если вы используете cReplace вместо замены? – Jakodns

+0

@Jakodns 'Метод вызова не удалось, потому что [System .__ ComObject] не содержит метод, названный«CReplace». В строке: 26 символ: 13 + $ objRange.CReplace ("А", "А") + ~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ + CategoryInfo: InvalidOperation: (CReplace: String) [], RuntimeException + FullyQualifiedErrorId: MethodNotFound' –

ответ

0

Попробуйте операции замены, как так

... 
$optionalParameter = [System.Type]::Missing 
$objRange.Replace('á', 'a', $optionalParameter, $optionalParameter, $true) 
... 

так, что первые два необязательных параметра не используются, а затем $true передается для указания соответствия дела - см here для подписи

+0

Тот же результат заменяет верхний и нижний регистр 'á'. Изменено значение $ false to $ true, и оно работает как шарм. Я хотел, чтобы он соответствовал чувствительности к регистру. Благодаря! –