为了一个较大的vba应用程序,我需要使用powershell脚本来获取共享文件夹中的文件名。由于我住在德国,这些文件名包含许多德语特殊字符,如ü、ä等。
Powershell脚本的输出,在PS控制台上应该(并且确实)正确显示这些字符,但在VBA中却没有正确显示。我编写了这个最小示例来证明这一点。
任何能返回für而不是fr的解决方案都会得到赞赏。
Option Explicit
Const HK = """"
Sub ScanDrive()
Dim s As String, command As String
command = "echo 'für'"
Debug.Print (command)
'Method1: start PS in CMD with /u parameter
s = CreateObject("Wscript.Shell").exec("cmd /u /c powershell.exe -command " & HK & command & HK).StdOut.ReadAll
Debug.Print (s)
'Method2: start PS directly (preferred)
s = CreateObject("Wscript.Shell").exec("powershell.exe -command " & HK & command & HK).StdOut.ReadAll
Debug.Print (s)
End Sub
我的输出看起来像这样(虽然VBA根本不显示“ `”字符):
echo 'für'
fr
fr
我已经学习到在写入文件输出时可以更改PS的输出编码,但不幸的是这不是一个选项。
我理解,我需要让Excel读取UTF-8(我猜这就是它的编码方式),或者让PS控制台输出Win-1252(这只是我的猜测,Excel使用的编码方式)。
由于我必须在公司部署此脚本,我不能依赖于PS控制台的任何全局开关。
更新
根据JosefZ的评论,我将命令作为[System.Console] :: OutputEncoding
并在VBA中获得了以下结果:
IsSingleByte : True
BodyName : ibm850
EncodingName : Westeurop„isch (DOS)
HeaderName : ibm850
WebName : ibm850
WindowsCodePage : 1252
IsBrowserDisplay : False
IsBrowserSave : False
IsMailNewsDisplay : False
IsMailNewsSave : False
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : True
CodePage : 850
与直接在PowerShell中运行它相反,其中它说明:
IsSingleByte : True
BodyName : iso-8859-1
EncodingName : Westeuropäisch (Windows)
HeaderName : Windows-1252
WebName : Windows-1252
WindowsCodePage : 1252
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : True
IsMailNewsSave : True
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : True
CodePage : 1252
CreateObject("Wscript.Shell")
似乎在Dos编码和CP850上工作。
$OutputEncoding
、[System.Console]::OutputEncoding
和[System.Console]::InputEncoding
必须与 VBA 脚本编码(或内部 Excel 编码)一致... - JosefZ