如何通过 VBS 将变量从一个 PS 脚本传递到另一个脚本?

How can I pass a variable from one PS script to another via VBS?

我正在使用带有 3 个文件的 GUI 编写 PowerShell 脚本:

在window1中,我在textbox1中输入value1,然后点击button

点击它,value1应该存储到一个global variable中,这样window2就可以弹出(通过VBS)并使用value1

window1button 的代码:

$button_OnClick= 
{
    $global:value1 = $textBox1.Text
    start-process .\start.vbs
}

start.vbs:

Set objShell = CreateObject("Wscript.Shell")
objShell.run("powershell.exe -nologo -file .\window2.ps1"), 0, True

到目前为止一切顺利。据我了解, value1 是一个全局变量,可以在 window2.ps1.

中使用

所以 window2 是一个空的 window,只有一个文本应该显示 value1

$label1.Text = "$value1"

但由于某种原因,变量为空,window2为空。

我错过了什么?我仍在学习 PowerShell,可能会遗漏一个细节。

note: I know the way I open up window2 via .vbs is weird. But that way, the GUI opens up without any PowerShell window in the background.

A "global variable" 并不是您计算机上的每个进程都能神奇地使用的东西。您正在启动两个完全独立的 PowerShell 进程。 None 他们的东西是共享的。

如果要在第二个 PowerShell 进程中使用该值,则需要将该值作为命令行参数提供给第二个 PowerShell 进程。

这意味着您必须将第一个 PowerShell 脚本生成的值作为命令行参数提供给中间 VBScript,因为这也是一个完全独立的过程。

第一个 PowerShell 脚本使用两个参数(脚本名称和值)调用 wscript.exe:

$button_OnClick= 
{
    $value1 = $textBox1.Text
    Start-Process wscript.exe "window2.vbs","`"$value1`""
}

假设用户输入了 Hello World!,这将执行命令行(注意引号,它们确保带空格的值不会被视为单独的参数):

wscript.exe window2.vbs "Hello World!"

然后 VBS 中介可以从它的第一个命令行参数中读取 Hello World!(引号将被删除,因此我们需要为下一次调用添加回来):

value1 = WScript.Arguments.Unnamed(0)

Set objShell = CreateObject("Wscript.Shell")
objShell.run("powershell.exe -nologo -file .\window2.ps1 """ & value1 & """"), 0, True

现在执行以下命令行:

powershell.exe -nologo -file .\window2.ps1 "Hello World!"

然后第二个 PowerShell 脚本可以从它的第一个命令行参数中提取 Hello World!,就像 VBScript 所做的那样(引号将再次被删除):

$label1.Text = $args[0]

我建议您制作一个 VBScript windowless.vbs 可以 运行 任何无窗口命令:

' windowless.vbs
For Each arg In WScript.Arguments
    If InStr(arg, " ") > 0 Then
        cmd = cmd & """" & arg & """ "
    Else
        cmd = cmd & arg & " "
    End If
Next
CreateObject("WScript.Shell").Run(Trim(cmd)), 0, True

然后在您的 PowerShell 脚本中使用它

$value1 = "Hello World!"
Start-Process wscript.exe "windowless.vbs","powershell.exe","-nologo","-file window2.ps1","`"$value1`""

这将创建此命令行

powershell.exe -nologo -file .\window2.ps1 "Hello World!"

这正是我们在这里所需要的,它可以很容易地重复用于其他情况。