gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:19:38 31 4
gpt4 key购买 nike

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

  • window1.ps1 - 输入变量并启动start.vbs
  • start.vbs - 启动window2.ps1
  • window2.ps1 - 显示在 window1 中输入的值

在 window1 中,我在 textbox1 中输入 value1 并单击按钮

gui window 1

通过单击它,value1 应存储到全局变量中,以便 window2 可以弹出(通过 VBS)并使用 值1

window1按钮的代码:

$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 是一个空窗口,只有应显示 value1 的文本。

$label1.Text = "$value1"

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

gui window 2

我错过了什么?我仍在学习 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.

最佳答案

“全局变量”并不是神奇地可供计算机上的每个进程使用的东西。您正在启动两个完全独立的 PowerShell 进程。他们的任何东西都不会被共享。

如果您想在第二个 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!"

这正是我们所需要的,并且可以轻松地在其他情况下重用它。

关于winforms - 如何通过 VBS 将变量从一个 PS 脚本传递到另一个 PS 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60510519/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com