Powershell从visual basic脚本获取返回值

Powershell从visual basic脚本获取返回值,powershell,vbscript,Powershell,Vbscript,我有一些VisualBasic脚本中的旧代码。我想从PowerShell调用VB脚本并捕获它们的返回值,而不是将这段旧代码重新写入PowerShell 如何在powershell中获取visual basic脚本的返回值 大概是这样的: (Start-Process -FilePath "wscript.exe" -ArgumentList "Script.vbs" -Wait -Passthru).ExitCode $returnValue=Invoke命令-ScriptBlock{.\vb

我有一些VisualBasic脚本中的旧代码。我想从PowerShell调用VB脚本并捕获它们的返回值,而不是将这段旧代码重新写入PowerShell

如何在powershell中获取visual basic脚本的返回值

大概是这样的:

(Start-Process -FilePath "wscript.exe" -ArgumentList "Script.vbs" -Wait -Passthru).ExitCode
$returnValue=Invoke命令-ScriptBlock{.\vbs\legacyVbsFunction.vbs}
visual basic函数可能如下所示

Function MyFunction() As Double
    Return 3.87 * 2
End Function

在VBS中没有真正的退出代码,而是有一个函数的返回。 要真正获得返回代码,必须使用以下命令关闭脚本:

wscript.quit(0) 

在powershell脚本中,必须执行vbs,如下所示:

(Start-Process -FilePath "wscript.exe" -ArgumentList "Script.vbs" -Wait -Passthru).ExitCode

在VBS中没有真正的退出代码,而是有一个函数的返回。 要真正获得返回代码,必须使用以下命令关闭脚本:

wscript.quit(0) 

在powershell脚本中,必须执行vbs,如下所示:

(Start-Process -FilePath "wscript.exe" -ArgumentList "Script.vbs" -Wait -Passthru).ExitCode

听起来您想捕获VBScript的(标准输出)输出:

$output=cscript.exe//nologo。\vbs\legacyVbsFunction.vbs
请注意,
$output
将是单个字符串(如果脚本只输出一行),或者是多行输出的字符串数组


对于示例,假设
\vbs\legacyVbsFunction.vbs
包含以下代码:

函数MyFunction
MyFunction=3.87*2
端函数
'调用函数并将其打印到标准输出。
Echo(MyFunction)
您可以捕获输出并将其转换为
[double]
,如下所示:

[double]$output=cscript.exe//nologo。\vbs\legacyVbsFunction.vbs

$output
然后包含
7.74

听起来像是要捕获VBScript(stdout)的输出:

$output=cscript.exe//nologo。\vbs\legacyVbsFunction.vbs
请注意,
$output
将是单个字符串(如果脚本只输出一行),或者是多行输出的字符串数组


对于示例,假设
\vbs\legacyVbsFunction.vbs
包含以下代码:

函数MyFunction
MyFunction=3.87*2
端函数
'调用函数并将其打印到标准输出。
Echo(MyFunction)
您可以捕获输出并将其转换为
[double]
,如下所示:

[double]$output=cscript.exe//nologo。\vbs\legacyVbsFunction.vbs

$output
然后包含
7.74

您实际上可以使用名为ScriptControl的com对象将vbscript函数嵌入到powershell中,但它仅在32位powershell中工作,C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe:

我发现您可以以32位的方式运行作业:

$returnvalue = 
start-job {
  function Call-VBScript {
    $sc = New-Object -ComObject MSScriptControl.ScriptControl.1
      $sc.Language = 'VBScript'
      $sc.AddCode('
        Function MyFunction
          MyFunction = 3.87 * 2
        End Function
      ')
    $sc.CodeObject
  }

  $vb = call-vbscript
  $vb.MyFunction()
} -runas32 | wait-job | receive-job

"returnvalue is " + $returnvalue


实际上,您可以使用名为ScriptControl的com对象将vbscript函数嵌入到powershell中,但它仅在32位powershell C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe中有效:

我发现您可以以32位的方式运行作业:

$returnvalue = 
start-job {
  function Call-VBScript {
    $sc = New-Object -ComObject MSScriptControl.ScriptControl.1
      $sc.Language = 'VBScript'
      $sc.AddCode('
        Function MyFunction
          MyFunction = 3.87 * 2
        End Function
      ')
    $sc.CodeObject
  }

  $vb = call-vbscript
  $vb.MyFunction()
} -runas32 | wait-job | receive-job

"returnvalue is " + $returnvalue


a) 您声称的VBScript代码不是VBScript代码(VBScript不支持键入的返回值)。b) 函数的返回值不设置脚本的退出代码。c) 退出代码是整数。不支持浮点值。请创建允许我们重现您面临的实际问题的。a)您声称的VBScript代码不是VBScript代码(VBScript不支持键入的返回值)。b) 函数的返回值不设置脚本的退出代码。c) 退出代码是整数。不支持浮点值。请创建一个允许我们重现您面临的实际问题的。不需要启动进程。PowerShell将最后一个外部命令的退出代码存储在自动变量
$LastExitCode
中。不过,您可能需要使用
cscript.exe
而不是默认的
wscript.exe
运行VBScript。事实上,尽管我认为它也可以与wscript.exe一起使用。刚刚测试过它
wscript.exe
不能以任何方式使用,因为它不返回退出代码(可能是因为它异步运行脚本)。进行了快速测试。创建了一个只包含wscript.quit(101)的vbscript,并在powershell脚本中放入以下命令:(启动进程-文件路径“wscript.exe”-ArgumentList“C:\Users\theje\Desktop\Tests\Teeets.vbs”-Wait-Passthru)。ExitCode运行良好:PS C:\Users\theje>(启动进程-文件路径“wscript.exe”-ArgumentList“C:\Users\theje\Desktop\Tests\Teeets.vbs”-Wait-Passthru).ExitCode 101Ah,我省略了参数
-PassThru
。现在有意义了。但即便如此,
wscript.exe
也只能用于
启动进程-Wait-PassThru
,因此我仍然建议改用
cscript.exe
启动进程
不是必需的。PowerShell存储最后一个外部程序的退出代码自动变量
$LastExitCode
中的nal命令。您可能需要使用
cscript.exe
来运行VBScript,而不是默认的
wscript.exe
。事实上,尽管我认为它也可以与wscript.exe一起工作。只是对它进行了测试。
wscript.exe
不能以任何方式使用,因为它不会返回退出代码e(可能是因为它异步运行脚本)。进行了快速测试。创建了一个只有wscript.quit(101)的vbscript,并在powershell脚本中放入以下命令:(启动进程-文件路径“wscript.exe”-ArgumentList“C:\Users\theje\Desktop\Tests\Teets.vbs”-Wait-Passthru)。ExitCode运行良好:PS C:\Users\theje>(启动进程-文件路径“wscript.exe”-参数列表“C:\Users\theje\Desktop\Tests\Teeets.vbs”-Wait-Passthru)。退出代码101Ah,我省略了参数
-Passthru
。现在有意义了。但即使如此,
wscript.exe
也只能与
启动进程-Wait-Passthru