从 WScript.Shell 运行 Powershell(x86)

问题描述

我想使用 VBA 在 Powershell(x86) 中执行以下语句:

%systemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe Set-ExecutionPolicy -Scope CurrentUser Unrestricted -force; 
$DBPath = "U:\Data\distribution\Common\dist\Weekly Hours Entry\DC Master Production DB V2\Packing Slip Generation\PackingSlipGeneratorBE.accdb"; 
$sql = "SELECT vendOR,PackingSlipID,EntryNumber,ShipDate,TrackingNumber,RA,EntryDate FROM tblPackingSlipLog WHERE EntryNumber>1000001 AND EntryNumber<1000011;";
$Output = "C:\Users\foo\Documents\Test.csv";
$Con= New-Object -TypeName System.Data.OleDb.OleDbConnection;
$con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= $DBpath";
$ConCommand= $Con.CreateCommand();$ConCommand.CommandText = $sql;
$OAdapt = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $ConCommand;
$DS = New-Object -TypeName System.Data.DataSet;$OAdapt.Fill($DS);
export-csv -InputObject $DS.Tables[0] -Path $Output -NoTypeinformation -force;$Con.Close()

我可以在 Powershell(x86) 中只运行 Powershell(x86),没有问题。此外,如果我在命令提示符中运行 %systemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe 部分,然后分别运行 powershell 部分,它也可以按预期工作。但是,当我尝试将它们一起运行时,它不起作用。

调用 VBA 函数GetPackingSlipData ("WHERE EntryNumber>1000001 AND EntryNumber<1000011")

Function GetPackingSlipData(strsql_WhereClause As String) As String
    On Error Resume Next
    Dim wsShell As Object
    
    Dim strPowerShellCommand As String
    Dim strOutputFile As String
    strOutputFile = GetDocuments & "\Test.csv"
    
    Set wsShell = CreateObject("WScript.Shell")
    strPowerShellCommand = "%systemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe Set-ExecutionPolicy -Scope CurrentUser Unrestricted -force; $DBPath = ""U:\Data\distribution\Common\dist\Weekly Hours Entry\DC Master Production DB V2\Packing Slip Generation\PackingSlipGeneratorBE.accdb""; " & _
                           "$sql = ""SELECT vendOR,EntryDate FROM tblPackingSlipLog " & strsql_WhereClause & ";"";" & _
                           "$Output = """ & strOutputFile & """;" & _
                           "$Con= New-Object -TypeName System.Data.OleDb.OleDbConnection;$con.ConnectionString = ""Provider=Microsoft.ACE.OLEDB.12.0;Data Source= $DBpath"";" & _
                           "$ConCommand= $Con.CreateCommand();$ConCommand.CommandText = $sql;" & _
                           "$OAdapt = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $ConCommand;" & _
                           "$DS = New-Object -TypeName System.Data.DataSet;$OAdapt.Fill($DS);" & _
                           "export-csv -InputObject $DS.Tables[0] -Path $Output -NoTypeinformation -force;$Con.Close()"
                           
    Debug.Print strPowerShellCommand
    
    Call wsShell.Run(strPowerShellCommand,1,True)
    If Err.Number <> 0 Then
        GetPackingSlipData = "Error: " & Err.Number & "," & Err.Description
    Else
        GetPackingSlipData = strOutputFile
    End If
    
    On Error GoTo 0
End Function

打印的命令:

%systemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe Set-ExecutionPolicy -Scope CurrentUser Unrestricted -force; $DBPath = "U:\Data\distribution\Common\dist\Weekly Hours Entry\DC Master Production DB V2\Packing Slip Generation\PackingSlipGeneratorBE.accdb"; $sql = "SELECT vendOR,EntryDate FROM tblPackingSlipLog WHERE EntryNumber>1000001 AND EntryNumber<1000011;";$Output = "C:\Users\foo\Documents\Test.csv";$Con= New-Object -TypeName System.Data.OleDb.OleDbConnection;$con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= $DBpath";$ConCommand= $Con.CreateCommand();$ConCommand.CommandText = $sql;$OAdapt = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $ConCommand;$DS = New-Object -TypeName System.Data.DataSet;$OAdapt.Fill($DS);export-csv -InputObject $DS.Tables[0] -Path $Output -NoTypeinformation -force;$Con.Close()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)