如何通过 VBS 将变量从一个 PS 脚本传递到另一个脚本?
How can I pass a variable from one PS script to another via VBS?
我正在使用带有 3 个文件的 GUI 编写 PowerShell 脚本:
window1.ps1
- 输入变量并开始 start.vbs
start.vbs
- 开始 window2.ps1
window2.ps1
- 显示在 window1 中输入的值
在window1中,我在textbox1
中输入value1
,然后点击button
。
点击它,value1
应该存储到一个global variable
中,这样window2
就可以弹出(通过VBS)并使用value1
。
window1
中 button
的代码:
$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!"
这正是我们在这里所需要的,它可以很容易地重复用于其他情况。
我正在使用带有 3 个文件的 GUI 编写 PowerShell 脚本:
window1.ps1
- 输入变量并开始start.vbs
start.vbs
- 开始window2.ps1
window2.ps1
- 显示在 window1 中输入的值
在window1中,我在textbox1
中输入value1
,然后点击button
。
点击它,value1
应该存储到一个global variable
中,这样window2
就可以弹出(通过VBS)并使用value1
。
window1
中 button
的代码:
$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!"
这正是我们在这里所需要的,它可以很容易地重复用于其他情况。