For Each循环中的变量值被保留

时间:2015-07-22 14:18:35

标签: vbscript

我是VBScript的新手,我遇到了一些麻烦。该脚本正在进行API调用并提取帐户信息,将数据放入CSV文件中。我将数据拉入数组,循环遍历每个帐户,如果某些属性符合条件,则将它们分配给要写入CSV的变量。我遇到的问题是,如果一个帐户符合属性,它会设置变量,如果下一个帐户不符合条件,则该变量仍然保留该值,在CSV中给出错误结果。

Set SFTPServer = WScript.CreateObject("SFTPCOMInterface.CIServer")
accounts = SFTPServer.AdminAccounts
For each admin in accounts
  adminName = admin.Login

  Dim count : count = admin.GetPermissionsCount()
  For i = 0 To CInt(count )- 1
    Set permission = admin.GetPermission(i)

'    AdminPermissionsPolicy:
'        ServerManagement = 0,
'        SiteManagement = 1,
'        STManagement = 2,
'        UserCreation = 3,
'        ChangePassword = 4,
'        COMManagement = 5,
'        ReportManagement = 6,


    Select case permission.Permission
      case 0:
        serverAdmin = "Server Admin"
      case 1:
        site = permission.SiteName
      case 2:
        stMan = "2"
      case 3:
        userCreate = "3"
      case 4:
        chPassword = "4"
      case 5:
        comMan = "5"
      case 6:
        report = "6"
    End Select
    Next

    WriteStuff.WriteLine""+adminName+"|"+site+"|"+stMan+"|"+userCreate+"|"+chPassword+"|"+comMan+"|"+report+"")
Next

3 个答案:

答案 0 :(得分:0)

不幸的是,VBScript中的变量要么是全局变量,要么是函数范围。

因此,您需要在for循环的每次迭代中重置每个变量。

一种方法是在脚本顶部写Dim dummy,在Select Case之前,写serverAdmin = dummysite = dummy等。

最好Dim明确所有变量,并在模块顶部使用Option Explicit来强制执行此操作。

答案 1 :(得分:0)

这是另一种方法,可以在不必每次迭代时清空每个变量的情况下执行所需操作。您已经记录了每个值在代码中的含义。而不是为此目的使用注释,而是将它们定义为范围块顶部的常量:

' AdminPermissionsPolicy:
Const ServerManagement = 0
Const SiteManagement   = 1
Const STManagement     = 2
Const UserCreation     = 3
Const ChangePassword   = 4
Const COMManagement    = 5
Const ReportManagement = 6

然后你可以声明一个数组来保存值:

Dim a(6)

然后在循环中,您可以使用Erase函数在每次迭代时清空数组。您可以使用常量名称而不是0/1/2/etc,并且在编写值时,可以使用Join()将数组值组合成字符串,而不必连接7个变量。

For each admin in accounts

    adminName = admin.Login
    Erase a                    ' Empty the Permissions array for each new account

    Dim count : count = admin.GetPermissionsCount()
    For i = 0 To CInt(count )- 1

        Set permission = admin.GetPermission(i)

        Select case permission.Permission
            case ServerManagement:    ' Now you can use the constant instead of "0"
                a(ServerManagement) = "Server Admin"
            case SiteManagement:
                a(SiteManagement) = permission.SiteName
            ...
        End Select
    Next

    WriteStuff.WriteLine Join(a, "|")  ' Use Join() to combine array values

Next

答案 2 :(得分:0)

让我们从输出开始。您想要打印由" |"分隔的项目列表(其中一些可能为空)。应该这样做:

WriteStuff.WriteLine Join(aOut, "|")

优点:

  1. 您不需要知道VBScript的串联运算符是&,而不是+,因为您甚至无法使用错误的加号。< / LI>
  2. 您不需要重复分隔符。
  3. 空字符串&#34;&#34;。
  4. 没有无用的预/等待处理
  5. 适用于任意数量的物品。
  6. aOut需要在循环中初始化。使用ReDim很容易 - 没有保留。

    优点:

    1. 您不需要知道Empty是VBScript中空/未初始化的文字。
    2. 您不需要为每个变量重复分配。
    3. 适用于任意数量的物品。
    4. 演示代码:

      Option Explicit
      
      Const cnUB = 3
      
      Dim nTest
      For nTest = 0 To cnUB
          ReDim aOut(cnUB)
          Select Case nTest
            Case 0
              aOut(0) = "A"
            Case 1
              aOut(1) = "B"
            Case 2
              aOut(2) = "C"
            Case 3
              aOut(3) = "D"
          End Select
          WScript.Echo Join(aOut, "|")
      Next
      

      输出:

      cscript 31565794.vbs
      A|||
      |B||
      ||C|
      |||D
      

      缺点:

      1. 匿名将数据放入数组(仅用数字/索引知道)可能比使用不同的变量(名称)更加错误。如果您需要进一步计算的元素,那么定义常量
      2. 可能是个好主意

        WTF

        Const ciReport = 1
        ...
        aOut(ciReport) = "B"