简化VBScript中的动态选择

简化VBScript中的动态选择,vbscript,parameters,Vbscript,Parameters,我已经编写了一个很好的小VBScript,它成功地替换了FileMaker中一个繁琐的、即缓慢的删除/导入/导出例程。我希望能够通过传递一个列列表来将它们连接起来,而不是在switch语句(或等效语句)中对它们进行硬编码,从而对其进行推广 我想传入第三个参数,比如字符串“3,8,1,2” 编辑 明确我的要求。我不介意交第三个参数。我要寻找的是一种VBScript风格的方法来简化从 "3,8,1,2" 到 在其他语言中,我使用lambda函数、求值代码或一个Yield 以下是目前的基本代码: O

我已经编写了一个很好的小VBScript,它成功地替换了FileMaker中一个繁琐的、即缓慢的删除/导入/导出例程。我希望能够通过传递一个列列表来将它们连接起来,而不是在switch语句(或等效语句)中对它们进行硬编码,从而对其进行推广

我想传入第三个参数,比如字符串“3,8,1,2”

编辑 明确我的要求。我不介意交第三个参数。我要寻找的是一种VBScript风格的方法来简化从

"3,8,1,2"

在其他语言中,我使用lambda函数、求值代码或一个Yield

以下是目前的基本代码:

Option Explicit
Dim objFs, objSrc, objDst, strLine, fields, value

If Wscript.arguments.count < 2 Then
    Wscript.echo "Usage: " + Wscript.ScriptName + " <input-file> <output-file>"
    Wscript.quit
End If

Set objFs = CreateObject("Scripting.FileSystemObject")
Set objSrc = objFs.OpenTextFile(Wscript.Arguments.item(0))
Set objDst = objFs.CreateTextFile(Wscript.Arguments.item(1))

While Not objSrc.atEndOfStream
    strLine = objSrc.ReadLine()
    If strLine <> "" Then
        ' Now build key string - fields 3, 8, 1, and 2
        fields = Split(strLine,vbTab)
        ' Write out the line to the destination file
        objDst.WriteLine fields(2)+" "+fields(7)+" "+fields(0)+" "+fields(1)+vbTab+"1"
    End If
Wend

objSrc.Close
objDst.Close
选项显式
Dim objFs、objSrc、objDst、strLine、字段、值
如果Wscript.arguments.count<2,则
Wscript.echo“用法:+Wscript.ScriptName+”
Wscript.quit
如果结束
设置objFs=CreateObject(“Scripting.FileSystemObject”)
设置objSrc=objFs.OpenTextFile(Wscript.Arguments.item(0))
设置objDst=objFs.CreateTextFile(Wscript.Arguments.item(1))
而不是objSrc.atEndOfStream
strLine=objSrc.ReadLine()
如果是strLine“”,那么
'现在构建键字符串-字段3、8、1和2
字段=拆分(strLine,vbTab)
'将行写入目标文件
objDst.WriteLine字段(2)+“”+字段(7)+“”+字段(0)+“”+字段(1)+vbTab++“1”
如果结束
温德
objSrc.关闭
objDst.关闭
有什么想法吗


[请随意批评代码。VBScript不是我的第一语言]

虽然我不会这样做,但您可以使用它作为数组值列表来计算表达式,这会删除
拆分()
,但仍然没有多大用处

Dim args:Set args=WScript.Arguments
模糊数据
data=EVal(“数组(&args(0)&”))
回送数据(1)
输出:

>cscript.exe/nologo test.vbs“3,8,1,2”
8.
注意:如果您确实使用此方法,它的功能非常强大,因此我建议您首先对任何输入进行清理,或者至少要确切知道您要传递给它的参数


尽管这可能令人恼火,但这里有一个在VBSCript中动态执行的答案

事实证明,您可以重新定义函数,或者实际上在VBScript中定义函数。谁知道呢

此测试脚本接受一个参数,该参数是字段列表,并使用它构建一个函数,然后应用于某些测试数据

Option Explicit
Dim fieldList, fields, x

If Wscript.arguments.count < 1 Then
    Wscript.echo "Usage: " & Wscript.ScriptName & " ""Key,field,list"""
    Wscript.quit
End If

fieldList = Wscript.Arguments.item(0)

Sub setupProcess()
    Wscript.echo "Set-up processLine() for passed in parameters: " & fieldList
    fields = Split(fieldList,",")
    '
    ' Runtime method-overloading
    '
    ExecuteGlobal _ 
    "Option Explicit: " & _
    "Function processLine( values ): " & _
    "    processLine = values("& Join(fields,")&"" ""+values(") &"): " & _
    "End Function:"
End Sub

setupProcess() ' set-up function dynamically

' test examples
Wscript.echo processLine(Split("a,b,c,d,e,g,h,i,j,k,l",","))
Wscript.echo processLine(Split("q,r,s,t,u,v,w,x,y,z",","))
Wscript.echo processLine(Split("1,2,3,4,5,6,7,8,9",","))

多亏了。

您已经在使用
WScript.Arguments
,所以只需添加另一个参数,然后使用
Split()
解析分隔字符串。:-)是的,已经完成了这一步。我更感兴趣的是将
字段(2)+++fields(7)+++fields(0)+++fields(1)
位替换为适当的位。在另一种语言中,我会使用lambda函数或Yield之类的东西……我不会真正使用数组并连接结果,VBScript是一种脚本语言,不是一种成熟的编程语言,不要期望太多。我想说的一件事是使用
&
来连接字符串,而不是
+
,两者都起作用。真正的连接字符是
&
,并且使用得更广泛。您可以使用
EVal()
,但不建议先清除输入。这取决于您想要的复杂程度,
EVal()
Execute()
ExecuteGlobal()
对于执行动态代码非常有用,但就像我前面的评论一样,直接从脚本输入执行代码时需要小心。在动态函数中执行Split()会更好一点。只是您最初的问题不是很清楚,很好的发现。感谢Lankymart——已经做了您建议的更改——测试明显会产生相同的输出,但封装性更好。谢谢。我实际上指的是
processLine()
中的
Split()
,当命令行要执行
a、b、c、d、e、g、h、I、j、k、l
等操作时,这样传递它似乎很不整洁。
Option Explicit
Dim fieldList, fields, x

If Wscript.arguments.count < 1 Then
    Wscript.echo "Usage: " & Wscript.ScriptName & " ""Key,field,list"""
    Wscript.quit
End If

fieldList = Wscript.Arguments.item(0)

Sub setupProcess()
    Wscript.echo "Set-up processLine() for passed in parameters: " & fieldList
    fields = Split(fieldList,",")
    '
    ' Runtime method-overloading
    '
    ExecuteGlobal _ 
    "Option Explicit: " & _
    "Function processLine( values ): " & _
    "    processLine = values("& Join(fields,")&"" ""+values(") &"): " & _
    "End Function:"
End Sub

setupProcess() ' set-up function dynamically

' test examples
Wscript.echo processLine(Split("a,b,c,d,e,g,h,i,j,k,l",","))
Wscript.echo processLine(Split("q,r,s,t,u,v,w,x,y,z",","))
Wscript.echo processLine(Split("1,2,3,4,5,6,7,8,9",","))