Powershell 将字符串参数发送到开始作业脚本块

Powershell 将字符串参数发送到开始作业脚本块,powershell,batch-file,vbscript,Powershell,Batch File,Vbscript,我需要使用shell初始化一个作业。作业将是延迟加上对vbScript的调用。下面的代码工作正常。在我的例子中,vbScript只是一行MsgBox Hello world 当我想要参数化vbScript路径时,问题就出现了。其思想是对一些不同的VBScript执行几个不同的调用。 当我这样做时,命令似乎忽略了参数输入。我用int参数做了其他测试,它们工作得很好,问题似乎只是字符串参数。以下代码不起作用: $functions = { Function execute_vbs {

我需要使用shell初始化一个作业。作业将是延迟加上对vbScript的调用。下面的代码工作正常。在我的例子中,vbScript只是一行MsgBox Hello world

当我想要参数化vbScript路径时,问题就出现了。其思想是对一些不同的VBScript执行几个不同的调用。 当我这样做时,命令似乎忽略了参数输入。我用int参数做了其他测试,它们工作得很好,问题似乎只是字符串参数。以下代码不起作用:

$functions = {
    Function execute_vbs {
        param ([string]$path_VBScript, [int]$secs)
        Start-Sleep -Seconds $secs
        cscript /nologo $path_VBScript 
    }
}
$input = 'C:\Users\[USERNAME]\Desktop\hello_world.vbs'
$seconds = 2
Start-Job -InitializationScript $functions -ScriptBlock {execute_vbs -path_VBScript $input -secs $seconds} -Name MyJob
我也尝试过使用[-ArgumentList]命令,但它也有同样的问题

有什么想法吗?

问题在于脚本块中的$input和$SECONS变量位于不同的范围内,实际上与主脚本中的变量不同

我稍微修改了您的脚本,以删除对VBScript的调用,使其更易于在此处复制-我的示例代码是:

$functions={ 函数执行_vbs{ 参数[string]$path_VBScript,[int]$secs 开始睡眠-秒$秒 写入输出文件名=“$path\u VBScript” 写入输出秒数=“$secs” } } 有两种方法可以解决此问题:

使用:范围修饰符

有关详细信息,请参见,但基本上:

对于在会话外执行的任何脚本或命令,都需要使用作用域修饰符来嵌入调用会话作用域中的变量值,以便会话外代码可以访问它们

$filename='C:\Users\[USERNAME]\Desktop\hello\u world.vbs' $seconds=2 $job=开始作业-初始化脚本$functions-脚本块{ 执行_vbs-path_VBScript$使用:filename-secs$使用:秒 }-命名我的工作 等待作业$job 接收job$job 输出: 文件名='C:\Users\[USERNAME]\Desktop\hello\u world.vbs' 秒='2' 注意脚本块中变量名前面的$using-这允许您将主脚本中的变量注入到脚本块中

脚本块参数

您可以在脚本块上定义与使用函数类似的参数,然后在调用Start Job时在-ArgumentList参数中提供值

$filename='C:\Users\[USERNAME]\Desktop\hello\u world.vbs' $seconds=2 $job=开始作业-初始化脚本$functions-脚本块{ 参数[string]$f[int]$s 执行_vbs-path_VBScript$f-secs$s }-ArgumentList@$filename,$seconds-Name MyJob 等待作业$job 接收job$job 输出: 文件名='C:\Users\[USERNAME]\Desktop\hello\u world.vbs' 秒='2' `` 问题在于,脚本块中的$input和$SECONS变量位于不同的范围内,实际上与主脚本中的变量不同

我稍微修改了您的脚本,以删除对VBScript的调用,使其更易于在此处复制-我的示例代码是:

$functions={ 函数执行_vbs{ 参数[string]$path_VBScript,[int]$secs 开始睡眠-秒$秒 写入输出文件名=“$path\u VBScript” 写入输出秒数=“$secs” } } 有两种方法可以解决此问题:

使用:范围修饰符

有关详细信息,请参见,但基本上:

对于在会话外执行的任何脚本或命令,都需要使用作用域修饰符来嵌入调用会话作用域中的变量值,以便会话外代码可以访问它们

$filename='C:\Users\[USERNAME]\Desktop\hello\u world.vbs' $seconds=2 $job=开始作业-初始化脚本$functions-脚本块{ 执行_vbs-path_VBScript$使用:filename-secs$使用:秒 }-命名我的工作 等待作业$job 接收job$job 输出: 文件名='C:\Users\[USERNAME]\Desktop\hello\u world.vbs' 秒='2' 注意脚本块中变量名前面的$using-这允许您将主脚本中的变量注入到脚本块中

脚本块参数

您可以在脚本块上定义与使用函数类似的参数,然后在调用Start Job时在-ArgumentList参数中提供值

$filename='C:\Users\[USERNAME]\Desktop\hello\u world.vbs' $seconds=2 $job=开始作业-初始化脚本$functions-脚本块{ 参数[string]$f[int]$s 执行_vbs-path_VBScript$f-secs$s }-ArgumentList@$filename,$seconds-Name MyJob 等待作业$job 接收job$job 输出: 文件名='C:\Users\[USERNAME]\Desktop\hello\u world.vbs' 秒='2' ``
我是如此接近!呵呵。我对这种编程语言非常陌生。非常感谢你!!我花了大约14个小时才来到论坛:PI是如此接近!呵呵。我对这种编程语言非常陌生。非常感谢你!!我花了大约14个小时才来到论坛:这能回答你的问题吗?不是真的。在我的例子中,解决方案是在每个变量之前加上$using:,但是谢谢
伊威-这回答了你的问题吗?不管怎样,它都是重复的,以前被多次报道过。只需要在发布前搜索。我以前没有找到这个问题,我已经搜索过了。这看起来很相似,但这个问题没有回答我的疑问这回答了你的问题吗?不是真的。在我的例子中,解决方案是在每个变量之前加上$using:-这回答了你的问题吗?不管怎样,它都是重复的,以前被多次报道过。只需要在发布前搜索。我以前没有找到这个问题,我已经搜索过了。看起来很相似,但这个问题没有回答我的疑问
$functions = {
    Function execute_vbs {
        param ([string]$path_VBScript, [int]$secs)
        Start-Sleep -Seconds $secs
        cscript /nologo $path_VBScript 
    }
}
$input = 'C:\Users\[USERNAME]\Desktop\hello_world.vbs'
$seconds = 2
Start-Job -InitializationScript $functions -ScriptBlock {execute_vbs -path_VBScript $input -secs $seconds} -Name MyJob