我正在尝试整合一个脚本,将几个excel文件转换为PDF。这是我第一次在Powershell中做这样的事情。 I found a link to one online that works。
$path = Read-Host -Prompt 'Input Directory Path and Press Enter'
$xlFixedFormat = “Microsoft.Office.Interop.Excel.xlFixedFormatType” -as [type]
$excelFiles = Get-ChildItem -Path $path -include *.xls, *.xlsx -recurse
$objExcel = New-Object -ComObject excel.application
$objExcel.visible = $false
foreach($wb in $excelFiles)
{
$filepath = Join-Path -Path $path -ChildPath ($wb.BaseName + “.pdf”)
$workbook = $objExcel.workbooks.open($wb.fullname, 3)
$workbook.Saved = $true
“saving $filepath”
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath)
$objExcel.Workbooks.close()
}
$objExcel.Quit()
如果我将其复制并粘贴到Powershell中,程序将按预期运行。但是,当我尝试创建一个运行该程序的快捷方式时,我收到了几个错误(该文件保存为.ps1)。
这是我在设置快捷方式时所做的路径和参数:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -ExecutionPolicy Bypass -File C:\[File Path]
这是我收到的错误消息:
At C:\Users\cbeals.ENVIROTECH\Documents\Test\ConvertExcelToPDF.ps1:8 char:62
+ $filepath = Join-Path -Path $path -ChildPath ($wb.BaseName + “.pdf ...
+ ~
You must provide a value expression following the '+' operator.
At C:\Users\cbeals.ENVIROTECH\Documents\Test\ConvertExcelToPDF.ps1:8 char:63
+ ... lepath = Join-Path -Path $path -ChildPath ($wb.BaseName + “.pdfâ€)
+ ~~~~~~~~~~
Unexpected token '“.pdfâ€' in expression or statement.
At C:\Users\cbeals.ENVIROTECH\Documents\Test\ConvertExcelToPDF.ps1:8 char:62
+ $filepath = Join-Path -Path $path -ChildPath ($wb.BaseName + “.pdf ...
+ ~
Missing closing ')' in expression.
At C:\Users\cbeals.ENVIROTECH\Documents\Test\ConvertExcelToPDF.ps1:7 char:1
+ {
+ ~
Missing closing '}' in statement block or type definition.
At C:\Users\cbeals.ENVIROTECH\Documents\Test\ConvertExcelToPDF.ps1:8 char:73
+ ... lepath = Join-Path -Path $path -ChildPath ($wb.BaseName + “.pdfâ€)
+ ~
Unexpected token ')' in expression or statement.
At C:\Users\cbeals.ENVIROTECH\Documents\Test\ConvertExcelToPDF.ps1:14 char:1
+ }
+ ~
Unexpected token '}' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedValueExpression
任何想法为什么会失败?
澄清:
“
)是完全没问题的 - 请参阅底部部分。您的问题是您的脚本文件保存为UTF-8而没有BOM,这导致Windows PowerShell(但不是PowerShell Core)误解它,因为它默认为“ANSI”编码,即与之关联的单字节遗留编码遗留系统区域设置(例如,美国和西欧的Windows-1252),PowerShell称之为Default
。
虽然用ASCII对应物替换Unicode引号可以解决当前的问题,但脚本中的任何其他非ASCII范围字符都会继续被误解。
要演示具体问题:
“
,LEFT DOUBLE QUOTATION MARK(U+201C
)Unicode字符,以UTF-8格式编码为3个字节:0xE2 0x80 0x9C
。
您可以通过'“' | Format-Hex -Encoding Utf8
的输出验证这一点(这里只有字节序列很重要;右边的打印字符在这种情况下不具代表性)。“
的3个字符,即“
。
您可以使用[Text.Encoding]::Default.GetString([byte[]] (0xE2, 0x80, 0x9C))
验证这一点(来自PowerShell Core,使用[Text.Encoding]::GetEncoding([cultureinfo]::CurrentCulture.TextInfo.ANSICodePage).GetString([byte[]] (0xE2, 0x80, 0x9C))
)。在正确编码的输入文件中,PowerShell允许可互换地使用以下引号和标点字符;例如,"hi"
,”hi”
甚至"hi„
都是等价的。
"
(ASCII范围) - QUOTATION MARK (U+0022
)
“
- LEFT DOUBLE QUOTATION MARK (U+201C
)
”
- RIGHT DOUBLE QUOTATION MARK (U+201D
)
„
- DOUBLE LOW-9 QUOTATION MARK (U+201E
)
但不是:‟
- DOUBLE HIGH-REVERSED-9 QUOTATION MARK (U+201F
),即使它的单引号对应物被认可 - 请参阅this GitHub issue。'
- (ASCII范围)APOSTROPHE (U+0027
)
‘
- LEFT SINGLE QUOTATION MARK (U+2018)
’
- RIGHT SINGLE QUOTATION MARK (U+2019
)
‚
- SINGLE LOW-9 QUOTATION MARK (U+201A
)
‛
- SINGLE HIGH-REVERSED-9 QUOTATION MARK (U+201B
)-
(ASCII范围) - HYPHEN-MINUS (U+002D
)
–
- EN DASH (U+2013
)
—
- EM DASH (U+2014
)
―
- HORIZONTAL BAR (U+2015
)U+200B
(ZERO WIDTH SPACE)字符。在语法上不被视为空间。
空间:
(ASCII范围空间字符。)U+0020
(SPACE)
U+00A0
(NO-BREAK SPACE)
U+2002
(EN SPACE)
U+2003
(EM SPACE)
U+2004
(THREE-PER-EM SPACE)
U+2005
(FOUR-PER-EM SPACE))
U+2006
(SIX-PER-EM SPACE)
U+2007
(FIGURE SPACE)
U+2008
(PUNCTUATION SPACE)
U+2009
(THIN SPACE)
U+200A
(HAIR SPACE)
U+202F
(NARROW NO-BREAK SPACE)
U+205F
(MEDIUM MATHEMATICAL SPACE)
U+3000
(IDEOGRAPHIC SPACE)
制表符(显示为逃逸序列,因为这里不能直接打印):
"`t"
(ASCII范围标签字符。) - U+0009
(CHARACTER TABULATION)
"`v"
(ASCII范围vertical-tab char。) - U+000B
(LINE TABULATION))
行分隔空格:
(ASCII范围LF)U+000A
(LINE FEED)
(ASCII范围CR)U+000D
(CARRIAGE RETURN)注意:
SpecialCharacters
文件中的parserutils.cs
类)。[1]有一些例外:假设PowerShell的-eq
运算符使用不变文化比较字符串而不是执行序数比较,则字符串比较中的空格字符变体可能会被视为相同,具体取决于主机平台;例如,"foo bar" -eq "foo`u{a0}bar"
在macOS和Linux(但不是Windows!)上产生$true
,因为常规的ASCII范围空间被认为等于那里的无中断空间(U+00A0
)。