webForumDet fria alternativet

Spara till textfil med Visaul Basic script?!

20 svar · 608 visningar · startad av Dr-man

Dr-manMedlem sedan juli 2002732 inlägg
#1

Jag skulle vilja spara informationen som denna kod ger till
en textfil. Men vet inte hur? Kan nån hjälpa mig?!

Set objDomain = GetObject("WinNT://VNS" & strDomain) 
objDomain.Filter = Array("user") 
For each objUser in objDomain 
objUser.GetInfo 
WScript.echo objUser.Name & ", " & objUser.LoginScript 
Next
Dr-manMedlem sedan juli 2002732 inlägg
#2

Nu jag byggt lite vidare på koden

Set objDomain = GetObject("WinNT://VNS" & strDomain) 
objDomain.Filter = Array("user") 
For each objUser in objDomain 
  objUser.GetInfo 
  WScript.echo objUser.Name & ", " & objUser.LoginScript 
  Set fs = CreateObject("Scripting.FileSystemObject") 
  Set a = fs.CreateTextFile("f:\testfile.txt", True) 
  a.Write(objUser.Name) 
  a.Write(" ") 
  a.WriteLine(objUser.LoginScript) 
  a.Close 
Next

Det fungerar någorlunda. Två fel, som jag har med den är:

  1. Slippa att trycka på OK varje gång loopen körs.
  2. Den sparas endast den sista körda loopens info i textfilen

Är det nån som kan hjälpa med detta?

Engine^Medlem sedan dec. 20003 887 inlägg
#3

Iochmed att du använder WScript.Echo kommer du inte undan att trycka på Ok, eftersom den genererar en Message box. Koden kanske du kan möblera om lite och få en liten förbättring

Set objDomain = GetObject("WinNT://VNS" & strDomain) 
objDomain.Filter = Array("user") 

Set fs = CreateObject("Scripting.FileSystemObject") 
Set a = fs.CreateTextFile("f:\testfile.txt", True) 

For each objUser in objDomain 
  objUser.GetInfo 
  [blue]'WScript.echo objUser.Name & ", " & objUser.LoginScript [/blue]

  a.Write(objUser.Name) 
  a.Write(" ") 
  a.WriteLine(objUser.LoginScript) 
Next 

a.Close

Nu kommer koden inte att skriva över filen du skapar varje gång loopen körs, eftersom i det här fallet skapas filen endast en gång ;)

Dr-manMedlem sedan juli 2002732 inlägg
#4

Hur kan man lagra informationen till en MySQL-databasen?

mrblondeMedlem sedan aug. 20012 349 inlägg
#5

Du får skapa en databas och en tabell att spara datat i och sen får du göre en INSERT till den tabellen för varje loop du går igenom.

Dr-manMedlem sedan juli 2002732 inlägg
#6

Med objUser.FullName kan det listas bl.a namnen
Ville Person
Kalle Berg
Pelle Kanin
Lisa Holm

Hur skall man göra så att i samma textfil skriver namnen pånytt
men istället för att skriva ut det fullständiga namnet, så skrivs de två första tecknen av förnamnen och tre sista tecknen av efternamnen?

Engine^Medlem sedan dec. 20003 887 inlägg
#7
strNamn = objUser.FullName
strNamn = Left(strnamn, 2) & Right(strNamn, 3)

a.Write(strNamn)

Så ungefär?

Dr-manMedlem sedan juli 2002732 inlägg
#8

Just i den stilen!
Men istället de tre första tecknen i förnamnet och fyra första namnen i efternamnet, går det att göra detta?

@ndersMedlem sedan juni 200032 969 inlägg
#9

Jo, det går att göra på ett par olika sätt om man använder de strängfunktioner som finns i vbscript. Ett förslag är att använda Split() tillsammans med Left().

Mvh

Engine^Medlem sedan dec. 20003 887 inlägg
#10
Dim astrNamn(), strNamn

astrNamn = Split(objUser.FullName, " ")

strNamn = Left(astrNamn(0), 3) & Left(astrNamn(1), 4)

eller

strNamn = Left(Split(objUser.FullName, " ")(0), 3) & Left(Split(objUser.FullName, " ")(1), 4)
Dr-manMedlem sedan juli 2002732 inlägg
#11

Nu fungerar det nästan utmärkt, men ett litet problem ännu!
Problemet är att vissa namn med objUser.FullName har endast ett förnamn och när ett sådant namn körs med Split fås följande
felmeddelande:

Script: U:\Scripts\vns4.vbs
Line: 24
Char: 6
Error: Subscript out of range: '[number: 1]'
Code:800A0009
Source: Microsoft VBScript runtime error

Vad kan man göra åt detta?

@ndersMedlem sedan juni 200032 969 inlägg
#12

Dr-man skrev:

Vad kan man göra åt detta?

Man kan slänga in en if-sats som kontrollerar det först.

Engine^Medlem sedan dec. 20003 887 inlägg
#13
astrNamn = Split(objUser.FullName, " ")
strNamn = Left(astrNamn(0), 3)

If Ubound(astrNamn) > 0 Then strNamn = strNamn & Left(astrNamn(1), 4)
Dr-manMedlem sedan juli 2002732 inlägg
#14
Dim nr, nr2, strn, astrn

WScript.echo "Tryck OK för att starta!"

Set fs = CreateObject("Scripting.FileSystemObject") 
Set a = fs.CreateTextFile("f:\testen.txt", True) 

Set gs = CreateObject("Scripting.FileSystemObject") 
Set b = gs.CreateTextFile("f:\testen2.txt", True) 

nr = 0
nr2 = 0

Set objDomain = GetObject("WinNT://VNS" & strDomain) 
objDomain.Filter = Array("user") 
For each objUser in objDomain 
  objUser.GetInfo 
  if objUser.LoginScript = "" then
     nr = nr + 1
     astrn = Split(objUser.FullName, " ")
     If Ubound(astrNamn) > 0 Then 
       strNamnstrn = Left(astrn(0), 3) & Left(astrn(1), 4)
     End If
     a.WriteLine(nr & " | " & objUser.FullName & "  |  " & objUser.Name)
  else
     nr2 = nr2 + 1
     astrn = Split(objUser.FullName, " ")
     If Ubound(astrNamn) > 0 Then 
       strNamnstrn = Left(astrn(0), 3) & Left(astrn(1), 4)
     End If
     b.WriteLine(nr2 & " | " & objUser.FullName & "  |  " & objUser.Name & "  |  " & objUser.LoginScript & " | " & strn)
  end if
Next 
a.Close 
b.Close 
WScript.echo "Proceduren är slutförd"

Här är hela koden för vb-scriptet.
Den klagar ännu på detta:
Error: Type mismatch: 'Ubound'

@ndersMedlem sedan juni 200032 969 inlägg
#15
     [b]astrn[/b] = split(objUser.FullName, " ")
     If Ubound([b]astrNamn[/b]) > 0 Then

Finn ett fel. :)

red: Läs också här. ;)

Dr-manMedlem sedan juli 2002732 inlägg
#16

Den rätta koden är:

Dim nr, nr2, strn, astrn

WScript.echo "Tryck OK för att starta!"

Set fs = CreateObject("Scripting.FileSystemObject") 
Set a = fs.CreateTextFile("f:\testen.txt", True) 

Set gs = CreateObject("Scripting.FileSystemObject") 
Set b = gs.CreateTextFile("f:\testen2.txt", True) 

nr = 0
nr2 = 0

Set objDomain = GetObject("WinNT://VNS" & strDomain) 
objDomain.Filter = Array("user") 
For each objUser in objDomain 
  objUser.GetInfo 
  if objUser.LoginScript = "" then
     nr = nr + 1
     astrn = Split(objUser.FullName, " ")
     If Ubound(astrn) > 0 Then 
       strn = Left(astrn(0), 3) & Left(astrn(1), 4)
     End If
     a.WriteLine(nr & " | " & objUser.FullName & "  |  " & objUser.Name & " | " & strn)
  else
     nr2 = nr2 + 1
     astrn = Split(objUser.FullName, " ")
     If Ubound(astrn) > 0 Then 
       strn = Left(astrn(0), 3) & Left(astrn(1), 4)
     End If
     b.WriteLine(nr2 & " | " & objUser.FullName & "  |  " & objUser.Name & "  |  " & objUser.LoginScript & " | " & strn)
  end if
Next 
a.Close 
b.Close 
WScript.echo "Proceduren är slutförd"

Lite förbättringar, går det göra så att scriptet hoppar över eventuella bindestreck och tar följande tecken istället?

En liten bugg ifall förnamnet är tre tecken, så tar endast scriptet de tre första tecknen av efternamnet istället för fyra tecken!

Nån, som kan hjälpa till?

Engine^Medlem sedan dec. 20003 887 inlägg
#17
If Ubound(astrn) > 0 Then 
  If Len(astrn(0)) <= 3 Then
    strn = Left(astrn(0), Len(astrn(0)))
  Else
    strn = Left(astrn(0), 3)
  End If

  If Len(astrn(1)) <= 4 Then
    strn = strn & Left(astrn(1), Len(astrn(1)))
  Else
    strn = strn & Left(astrn(1), 4)
  End If
Else [blue]'Denna else-sats kanske är helt onödig, men den får vara med[/blue] ;)
  If Len(astrn(0)) <= 3 Then
    strn = Left(astrn(0), Len(astrn(0)))
  Else
    strn = Left(astrn(0), 3)
End If
Dr-manMedlem sedan juli 2002732 inlägg
#18
Dim nr, nr2, strn, astrn

WScript.echo "Tryck OK för att starta!"

Set fs = CreateObject("Scripting.FileSystemObject") 
Set a = fs.CreateTextFile("f:\testen.txt", True) 

Set gs = CreateObject("Scripting.FileSystemObject") 
Set b = gs.CreateTextFile("f:\testen2.txt", True) 

nr = 0
nr2 = 0

Set objDomain = GetObject("WinNT://VNS" & strDomain) 
objDomain.Filter = Array("user") 
For each objUser in objDomain 
  objUser.GetInfo 
  if objUser.LoginScript = "" then
     nr = nr + 1
     astrn = Split(objUser.FullName, " ")
     If Ubound(astrn) > 0 Then 
      If Len(astrn(0)) <= 3 Then
         strn = Left(astrn(0), Len(astrn(0)))
      Else
        strn = Left(astrn(0), 3)
      End If

      If Len(astrn(1)) <= 4 Then
        strn = strn & Left(astrn(1), Len(astrn(1)))
      Else
        strn = strn & Left(astrn(1), 4)
      End If
    'Else  
      If Len(astrn(0)) <= 3 Then
        strn = Left(astrn(0), Len(astrn(0)))
      Else
        strn = Left(astrn(0), 3)
      End If'

    End If
     a.WriteLine(nr & " | " & objUser.FullName & "  |  " & objUser.Name & " | " & strn)
  else
     nr2 = nr2 + 1
     astrn = Split(objUser.FullName, " ")
     If Ubound(astrn) > 0 Then 
      If Len(astrn(0)) <= 3 Then
         strn = Left(astrn(0), Len(astrn(0)))
      Else
        strn = Left(astrn(0), 3)
      End If

      If Len(astrn(1)) <= 4 Then
        strn = strn & Left(astrn(1), Len(astrn(1)))
      Else
        strn = strn & Left(astrn(1), 4)
      End If
    'Else  
      If Len(astrn(0)) <= 3 Then
        strn = Left(astrn(0), Len(astrn(0)))
      Else
        strn = Left(astrn(0), 3)
      End If'

    End If
     b.WriteLine(nr2 & " | " & objUser.FullName & "  |  " & objUser.Name & "  |  " & objUser.LoginScript & " | " & strn)
  end if
Next 
a.Close 
b.Close 
WScript.echo "Proceduren är slutförd"

Men denna kodsnutt, så ger den bara de tre första tecknen i efternamnet och inget annat! Är det nåt fel i kodsnutten?

Dr-manMedlem sedan juli 2002732 inlägg
#19

Ingen, som kan se ifall det är nå fel med kodsnutten?

Dr-manMedlem sedan juli 2002732 inlägg
#20

En annan fråga!
Kan man få denna information automatiskt öppnat i Excel?

138 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)