【问题标题】:Test if VBScript named argument exists测试是否存在 VBScript 命名参数
【发布时间】:2020-02-24 09:23:11
【问题描述】:

我想在验证该参数之前测试是否提供了特定的命名参数,因此我可以为缺失和无效条件提供有意义的错误代码。 我现在有这个

Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colArgs = WScript.Arguments.Named

If colArgs.Item("Script") Then
    If not objFSO.FileExists(colArgs.Item("Script")) Then
        intReturn = 1805
    End If
Else
    intReturn = 1639
End If

If Not intReturn Then
    msgBox colArgs.Item("Script"), 0, "Script"
Else
    msgBox intReturn, 0, "Error"
End If

我的期望是,如果我根本不提供一个名为 Script 的参数,我会得到值为 1639 的 Error msgBox。相反,我得到了好的 msgBox,其中 Script 为空白。 我也试过了

If Not colArgs.Item("Script") = "" Then

编辑:根据@Tomalak,我现在有了这个

Option Explicit
Dim objShell, objFSO, colArgs, intReturn

Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colArgs = WScript.Arguments.Named

If Not IsEmpty(colArgs.Item("Script")) Then
    If Not objFSO.FileExists(colArgs.Item("Script")) Then
        intReturn = 1805
    End If
Else
    intReturn = 1639
End If

If IsEmpty(intReturn) Then
    msgBox colArgs.Item("Script"), 0, "Script"
Else
    msgBox intReturn, 0, "Error"
End If

为了它的价值,我像这样从 PowerShell 调用 VBScript

$script = "\\Mac\iCloud Drive\Px Tools\Dev 4.0\#Spikes\Helper\Helper Target.ps1"
$arguments ="`"\\Mac\iCloud Drive\Px Tools\Dev 4.0\#Spikes\Helper\PxHelper.vbs`" //nologo /script:`"$script`" /wait:1"
Start-Process -filePath:Wscript.exe  -argumentList:$arguments

现在即使提供了脚本,我也会得到错误情况。 Grrr,星期一。

【问题讨论】:

  • @tomalak 我认为这很明显可以假设,但无论如何都要修改。
  • 最好始终定义您在示例代码中使用的所有内容。

标签: vbscript command-line-arguments


【解决方案1】:

如果命令行中没有给出命名参数

  • WScript.Arguments.Named.Exists("argname") 将返回 False
  • WScript.Arguments.Named("argname") 将返回一个 空值

如果在命令行中给出了一个命名参数但没有赋值 (/argname)

  • WScript.Arguments.Named.Exists("argname") 将返回 True
  • WScript.Arguments.Named("argname") 将返回一个 空值

如果在命令行中给出了带有空字符串的命名参数 (/argname:)

  • WScript.Arguments.Named.Exists("argname") 将返回 True
  • WScript.Arguments.Named("argname") 将返回一个 空字符串

如果在命令行中给定命名参数的值 (/argname:value)

  • WScript.Arguments.Named.Exists("argname") 将返回 True
  • WScript.Arguments.Named("argname") 将返回具有该值的字符串

空值与空字符串不同:它们是未初始化的,而空字符串是零长度的常规字符串。

您可以使用IsEmpty() 函数检查空值。

If Not WScript.Arguments.Named.Exists("foo") Then
    ' show message / end script / use default
End If

If IsEmpty(WScript.Arguments.Named("foo")) Then
    ' show message / end script / use default
End If

【讨论】:

  • 有趣。我试过了,它仍然无法正常工作。但是,如果我将 msgBox intReturn, 0, "Error" 移到条件之外,它会正确显示 1639。所以看来我的问题还在于 If Not intReturn Then
  • @Gordon 你已经用这个替换了你的If colArgs.Item("Script") Then 行,对吧?
  • 但是...If IsEmpty(intReturn) Then 确实有效。所以这两个问题领域的解决方案都是一样的。
  • Arg,不是那么快,戈登。它现在一直显示错误。我会修改 OP。
  • @Gordon 查看更新的答案,我完全忘记了.Exists()
猜你喜欢
  • 2011-09-07
  • 2017-06-30
  • 2013-08-14
  • 2011-08-03
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多