我正在尝试将一个脚本转换为几个excel文件。这是我第一次在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
任何想法为什么会失败?
最佳答案
澄清:
“
)完全可以-参见底部。 您的问题是您的脚本文件被保存为没有BOM的UTF-8,这会导致Windows PowerShell(但不是PowerShell Core)误解为,因为默认为ANSIt编码,即单字节与旧版系统语言环境(例如,美国和西欧的Windows-1252)关联的旧版编码,PowerShell调用
Default
。虽然用ASCII对应字符替换Unicode引号可以解决当前的问题,但是脚本中的任何其他非ASCII范围字符都将继续被误解。
为了演示具体问题:
左双重引用标记(
“
)Unicode字符U+201C
以UTF-8格式0xE2 0x80 0x9C
编码为3个字节。'“' | 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中可互换使用ASCII范围和Unicode引号/破折号/空格:
在正确编码的输入文件中,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)char。在语法上不被视为空格。
(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范围的垂直制表符)-U+000B
(LINE TABULATION))
(ASCII范围LF)U+000A
(LINE FEED)
(ASCII范围CR)U+000D
(CARRIAGE RETURN)注意:
SpecialCharacters
中的parserutils.cs
类)。 [1]有限的异常(exception)情况是:由于PowerShell的
-eq
运算符使用不变的区域性而不是执行序数比较来比较字符串,因此在字符串比较中可以将空格字符的变化视为相同,具体取决于主机平台;例如"foo bar" -eq "foo`u{a0}bar"
在macOS和Linux(而不是Windows!)上产生$true
,因为常规的ASCII范围空间被认为等于其中的不间断空间(U+00A0
)。
关于powershell - 将Powershell脚本粘贴到Powershell中时运行,但从快捷方式运行时不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55049410/