测试是否存在VBScript命名参数



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

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

编辑:Per@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 = "\MaciCloud DrivePx ToolsDev 4.0#SpikesHelperHelper Target.ps1"
$arguments ="`"\MaciCloud DrivePx ToolsDev 4.0#SpikesHelperPxHelper.vbs`" //nologo /script:`"$script`" /wait:1"
Start-Process -filePath:Wscript.exe  -argumentList:$arguments

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

如果命令行上没有给定命名参数

  • 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