我是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
答案 0 :(得分:0)
不幸的是,VBScript中的变量要么是全局变量,要么是函数范围。
因此,您需要在for
循环的每次迭代中重置每个变量。
一种方法是在脚本顶部写Dim dummy
,在Select Case
之前,写serverAdmin = dummy
,site = 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, "|")
优点:
&
,而不是+
,因为您甚至无法使用错误的加号。< / LI>
aOut
需要在循环中初始化。使用ReDim很容易 - 没有保留。
优点:
演示代码:
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
缺点:
WTF
Const ciReport = 1
...
aOut(ciReport) = "B"