2015-07-22 4 views
1

Я новичок в 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

К сожалению, переменные в VBScript являются либо глобальными, либо функциональными.

Таким образом, вам необходимо сбросить каждую переменную на каждой итерации цикла for.

Одним из способов было бы написать Dim dummy в верхней части вашего сценария, и как раз перед Select Case, написать serverAdmin = dummy, site = dummy и т.д.

Это хорошая практика, чтобы Dim явно все ваши переменные и использовать Option Explicit на вверху модуля для обеспечения этого.

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 
+0

Спасибо Бонд! У этого почти есть то, что я хочу. Мне все еще нужно добавить adminName к выходу. Я попытался добавить его в массив, но если первый случай соответствует ему, он заменяет имя администратора администратором сервера. Желаемый результат должен выглядеть так: adminName | server admin | siteName | ... – shafe

+0

Вы можете сделать его частью массива, но это испортит наши значения индекса массива, поэтому, вероятно, проще просто добавить его в свой вывод отдельно: 'WriteStuff. WriteLine adminName & "|" & Join (a, "|") ' – Bond

+0

Это получилось. Я тоже пытался это решение, но не имел правильного синтаксиса. Спасибо за вашу помощь Бонд! – shafe

0

Начнем с вывода. Вы хотите распечатать список элементов (некоторые из них, возможно, пустые), разделенные символом «|». Это должно быть сделано так:

WriteStuff.WriteLine Join(aOut, "|") 

Преимущества:

  1. Вам не нужно знать, что оператор конкатенации VBScript является &, не +, потому что вы не можете даже использовать неправильный с Присоединиться.
  2. Вам не нужно повторять разделитель.
  3. Нет бесполезной pre/ap-pending пустой строки "".
  4. Работы с любым количеством элементов.

aOut необходимо активизировать в цикле. Это легко с ReDim - без сохранения.

Преимущества:

  1. Вам не нужно знать, что Empty является буквальным для пустой/uninitialzed в VBScript.
  2. Вам не нужно повторять назначение для каждой переменной.
  3. Работы с любым количеством элементов.

Демо-код:

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. Ввод данных в массив анонимно (только известный номер/индекс) может быть more errorprone, чем использование отдельной переменной (name) s. Если вам нужны элементы для дальнейших вычислений это может быть хорошей идеей, чтобы определить константы

WTF

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