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