Powershell 和 Excel,使用 .replace 区分大小写
Powershell and Excel, case-sensitivity with .replace
我对 Powershell 脚本相当陌生,如果代码 and/or 解释草率,请原谅我。我正在尝试创建一个脚本来打开 Excel 电子表格并将所有特殊字母(æöý 等)替换为标准字符。
现在,该脚本可以工作了,但是它将电子表格中的所有大写字符都变成了小写字符(例如,“Ålborg”变成了 "alborg"),如果没有,我会更喜欢这样。我被引导相信 .replace 方法是区分大小写的,尽管这里似乎不是这种情况。
现在我尝试了一些东西,双引号而不是单引号,双引号和单引号,-creplace 而不是 .replace 只是吐出来
System.__ComObject
没有实际更改电子表格中的任何内容(我认为 $objRange 是一个数组,这是为什么?),为大写和小写字母添加一个 .replace,但没有任何效果。谁能指出我的错误?
代码:
$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')}
像这样尝试替换操作
...
$optionalParameter = [System.Type]::Missing
$objRange.Replace('á', 'a', $optionalParameter, $optionalParameter, $true)
...
以便不使用前两个可选参数,然后传递 $true
以指示匹配大小写 - 签名见 here
我对 Powershell 脚本相当陌生,如果代码 and/or 解释草率,请原谅我。我正在尝试创建一个脚本来打开 Excel 电子表格并将所有特殊字母(æöý 等)替换为标准字符。 现在,该脚本可以工作了,但是它将电子表格中的所有大写字符都变成了小写字符(例如,“Ålborg”变成了 "alborg"),如果没有,我会更喜欢这样。我被引导相信 .replace 方法是区分大小写的,尽管这里似乎不是这种情况。
现在我尝试了一些东西,双引号而不是单引号,双引号和单引号,-creplace 而不是 .replace 只是吐出来
System.__ComObject
没有实际更改电子表格中的任何内容(我认为 $objRange 是一个数组,这是为什么?),为大写和小写字母添加一个 .replace,但没有任何效果。谁能指出我的错误?
代码:
$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')}
像这样尝试替换操作
...
$optionalParameter = [System.Type]::Missing
$objRange.Replace('á', 'a', $optionalParameter, $optionalParameter, $true)
...
以便不使用前两个可选参数,然后传递 $true
以指示匹配大小写 - 签名见 here