2016-04-26 6 views
0

Я пишу VBScript, который выполняет поиск в Active Directory для объекта компьютера. Если объект не существует или существует и находится в правильном OU, тогда он должен запускать отдельный скрипт, который создает/присоединяет компьютер к AD.Если условия оператора не выполняются, код все еще выполняется

ObjExist_CorrectOU_7 = Null 
ObjExist_CorrectOU_10 = Null 

If compare = True Then 
    Win7_OU = "OU=DisallowRDP,OU=64Bit,OU=Win8" 
    Win10_OU = "OU=DisallowRDP,OU=64Bit,OU=Win10" 

    For x = 16 To 46 
    If Asc(Mid(objRS.Fields("distinguishedName"), x, 1)) = Asc(Mid(Win7_OU, (x - 15), 1)) Then 
     ObjExist_CorrectOU_7 = True 
    Else 
     ObjExist_CorrectOU_7 = False 
    End If 
    Next 

    For y = 16 To 46 
    If Asc(Mid(objRS.Fields("distinguishedName"), y, 1)) = Asc(Mid(Win10_OU, (y - 15), 1)) Then 
     ObjExist_CorrectOU_10 = True 
    Else 
     ObjExist_CorrectOU_10 = False 
    End If 
    Next 
End If 

If ObjExist_CorrectOU_7 = True Then 
    WScript.Echo "TRUE" 
End If 

Dim objShell 

Set objShell = WScript.CreateObject("WScript.Shell") 

filename = "C:\programdata\dell\kace\k2000_deployment_info.conf" 
Win7_Deployment = "deployment_name=Windows 7 x64 with SP1, join AD" 
Win10_Deployment = "deployment_name=Development Windows 10 (x64), join AD" 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set f = fso.OpenTextFile(filename) 

Do While Not f.AtEndOfStream 
    If ((f.ReadLine = Win7_Deployment) Or ((f.ReadLine = Win7_Deployment) And (ObjExist_CorrectOU_7 = True))) Then 
    WScript.Echo "IT WORKED!" 
    'objShell.Run "JoinAD_Win7.vbs" 
    Exit Do 
    End If 
    On Error Resume Next 
Loop 

f.Close 
Set g = fso.OpenTextFile(filename) 

Do While Not f.AtEndOfStream 
    If ((g.ReadLine = Win10_Deployment) Or ((g.ReadLine = Win10_Deployment) And (ObjExist_CorrectOU_10 = True))) Then 
    'objShell.Run "JoinAD_Win10.vbs" 
    WScript.Echo "IT WORKED AGAIN!" 
    Exit Do 
    End If 
    On Error Resume Next 
Loop 

g.Close 

Set objShell = Nothing 

Проблема я бегу в том, что два If..Then заявления выполняются каждый раз, даже если я знаю, что условия абсолютно не удовлетворяются.

Это связано с моим использованием Or и And?

+0

Добро пожаловать в StackOverflow; спасибо за сообщение вашего первого вопроса. Укажите конкретные заявления, о которых вы говорите. Для новых пользователей полезно прочитать следующее: [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask), [Идеальный вопрос] (http: //codeblog.jonskeet .uk/2010/08/29/writing-the-perfect-question /) и [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Пожалуйста, подумайте об изменении вашего вопроса. – MikeC

ответ

0

Ваш вопрос не удовлетворяет критериям Minimal, Complete, and Verifiable example.
Однако с первого взгляда: читать On Error Statement и ReadLine Method и Working with Files документация.

Do While Not f.AtEndOfStream 
    ''' ↓ this `ReadLine` reads every uneven line i.e. the 1st, 3rd, 5th, … 
    If ((f.ReadLine = Win7_Deployment) Or ((f.ReadLine = Win7_Deployment) And (ObjExist_CorrectOU_7 = True))) Then 
    '''  this one reads every even line ↑  i.e. the 2nd, 4th, 6th, … 
    WScript.Echo "IT WORKED!" 
    'objShell.Run "JoinAD_Win7.vbs" 
    Exit Do 
    End If 
    On Error Resume Next ' this causes that script continues on line next to IF … THEN 
         ' in case of uneven records in file. 
         ' i.e. runtimme error "Input past end of file" 
Loop 

использовать что-то вроде

Do While Not f.AtEndOfStream 
    sReadLine = f.ReadLine 
    If ((sReadLine = Win7_Deployment) Or ((sReadLine = Win7_Deployment) And (ObjExist_CorrectOU_7 = True))) Then 
    WScript.Echo "IT WORKED!" 
    'objShell.Run "JoinAD_Win7.vbs" 
    Exit Do 
    End If 
    ''' get rid of `On Error Resume Next` statement at all 
Loop 

А как насчет Do While Not f.AtEndOfStream последовать g.ReadLine? Используйте либо f, либо g (то же самое TextStream object в обоих) ...

+0

Во-первых, я не согласился бы с тем, чтобы не соответствовать критериям кода. Может быть немного слишком много кода, что не соответствует «минимальному» аспекту, но мне нужно было показать, откуда пришли переменные. Вот почему я предоставил стену кода. В будущем я попытаюсь воздержаться от этого, так как это, должно быть, затруднило вам ответить. Это, как говорится, ваш ответ имеет большой смысл. Я, очевидно, не понял смысла f.ReadLine, но вы поняли это. Спасибо. Я попробую ваше решение, назначив f.ReadLine переменной и вернусь обратно. Еще раз спасибо. – StayFroztee

+0

Это сработало, спасибо. – StayFroztee

Смежные вопросы