Avatar billede borsk Nybegynder
03. januar 2003 - 09:14 Der er 25 kommentarer og
1 løsning

Kontrollere styresystem og kopier filer derefter

Hejsa

Jeg skal bruge et lille program som kan først kontrollere hvilket styresystem der er på computeren (Win 95/98 2K XP)

Og så skal den kopiere den tilhørende fil f.esk. hvis win 95 kopiere x:\fil95.exe c:\programmer og hvis 2000 så kopiere x:\fil2k.exe c:\programmer osv

Jeg har fundet en bid kode her på eksperten som kan kontrollere systemet men jeg ved ikke hvordan jeg skal sætte det sammen.

Jeg er en nød til det her VB total rookie så det skal nok skæres ud i pap :)


Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type
Private Sub Form_Load()
    Dim OSInfo As OSVERSIONINFO, PId As String
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'KPDTeam@Allapi.net
    'Set the graphical mode to persistent
    Me.AutoRedraw = True
    'Set the structure size
    OSInfo.dwOSVersionInfoSize = Len(OSInfo)
    'Get the Windows version
    Ret& = GetVersionEx(OSInfo)
    'Chack for errors
    If Ret& = 0 Then MsgBox "Error Getting Version Information": Exit Sub
    'Print the information to the form
    Select Case OSInfo.dwPlatformId
        Case 0
            PId = "Windows 32s "
        Case 1
            PId = "Windows 95/98"
        Case 2
            PId = "Windows NT "
    End Select
    Print "OS: " + PId
    Print "Win version:" + Str$(OSInfo.dwMajorVersion) + "." + LTrim(Str(OSInfo.dwMinorVersion))
    Print "Build: " + Str(OSInfo.dwBuildNumber)
End Sub
Avatar billede martin_moth Mester
03. januar 2003 - 09:58 #1
Ret din Select Case så den ser sådan ud:

    Select Case OSInfo.dwPlatformId
        Case 0
            PId = "Windows 32s "
            shell "xcopy x:\win32s.exe c:\programmer /C /I /Y"
        Case 1
            PId = "Windows 95/98"
            shell "xcopy x:\win95.exe c:\programmer /C /I /Y"
        Case 2
            PId = "Windows NT "
            shell "xcopy x:\winNT.exe c:\programmer /C /I /Y"
    End Select

Som du kan se, har du selv fundet 99% af løsningen ;o)
Avatar billede martin_moth Mester
03. januar 2003 - 10:06 #2
Nu skriver du at det skal skæres ud i pap, så det gør jeg lige:

1) Start Visual Basic.
2) Opret et "Standard EXE" projekt.
3) dobbeltklik på den form der kommer frem (som hedder Form1)
4) Slet al den kode der står, og indsæt den kode du selv har angivet ovenfor
5) Udskift select case-delen med den kode jeg har givet
6) Kør projektet (F5)
7) Hvis du vil kompilere projektet til en .exe-fil, så du kan høre programmet uden Visual Basic, vælg File -> Make Project1.exe
8) Luk VB og omdøb Project1.exe til noget mere sigende

PS: For at teste programmet, kan du kommentere kopieringsdelen ud ved at sætte en ' foran de tre linier med shell "xcopy ..... Så bliver de linier ingoreret, og ingen filer kopieres :o)
Avatar billede arnvig Nybegynder
03. januar 2003 - 10:06 #3
måske vil det være godt med en

Case Else
      PId = "Ukendt"

+ at finde ud af hvad WIN 2000 og WIN XP har af dwPlatformId
Avatar billede borsk Nybegynder
03. januar 2003 - 11:27 #4
Martin moth jeg har rettet lidt frem og tilbage og det virker fint

MEN jeg har måske en lille problem det er lavet i form og ikke som modul
så hver gang jeg kører exe filen starter den en lille process op. (Det vindue som viser OS osv. det fjernede ved at lave en ' foran og valgte hide på formen men stadigvæk ligger den som process bagved.

Jeg vil bare have den til at udføre kopieringen og så slut ikke noget der hænger

Borsk
Avatar billede martin_moth Mester
03. januar 2003 - 11:50 #5
OK.

1) Så kan du undlade at skrive til din form, dvs slet linierne
    Print "OS: " + PId
    Print "Win version:" + Str$(OSInfo.dwMajorVersion) + "." + LTrim(Str(OSInfo.dwMinorVersion))
    Print "Build: " + Str(OSInfo.dwBuildNumber)

2) Smid en End ind som sidste linie, lige før End Sub - så lukker programmet sig selv

3) Hvis du ikke vil se formen de nanosekund den vil vises, hvis du gør ovenstående, kan du sætte dens egenskab Hidden til True. Det kan gøres ved at pille i Properties-vinduet i Visual Basic, eller ved at indsætte følgende kode i din Form_Load() som første linie: ( lige før du Dim'mer OSInfo osv)

  Form1.hidden = true
Avatar billede martin_moth Mester
03. januar 2003 - 11:53 #6
Sorry - skriv ikke
  Form1.hidden = true
men
  Form1.Visible = False
Avatar billede martin_moth Mester
03. januar 2003 - 11:54 #7
Øhh - hvis jeg læste dit spørgsmål ordentligt, ville jeg kunne se, at det blot er "End" du svanede :o)
Avatar billede martin_moth Mester
03. januar 2003 - 12:05 #8
svanede = savnede - og SÅ skal jeg nok holde med det klejnepis, før jeg går i selvsving - Over & Out
Avatar billede borsk Nybegynder
03. januar 2003 - 12:16 #9
Tak tak tak

Så lykkedes det nu virker mit lille program både under 95 2000 og XP

Borsk
Avatar billede borsk Nybegynder
03. januar 2003 - 12:30 #10
NEJ Typisk

Jeg troede lige og har givet dig point :(

Under XP tager den altså også det punkt under 2K istedet for sit eget.

Borsk
Avatar billede martin_moth Mester
03. januar 2003 - 13:00 #11
Det er vel fordi at OSInfo.dwPlatformId er end for win2k og Xp

Du kan evt prøve at udskrive OSInfo.dwPlatformId i en msgbox, og køre programmet på en XP og en 2k maskine, og se om værdien er forskellig. Er den det, kan du bare lave en ekstra Select Case...
Avatar billede martin_moth Mester
03. januar 2003 - 13:01 #12
OSInfo.dwPlatformId er end for win2k og Xp = OSInfo.dwPlatformId er FORSKELLIG for win2k og Xp
Avatar billede borsk Nybegynder
03. januar 2003 - 13:29 #13
Ja det er rigtigt osinfo.pwplatformid er ens både i NT XP og 2000 alle hedder Windows NT men versionen er forkert nemlig 2000 hedder 5.0 og XP 5.1

Så jeg skal vel identificere på version nummer istedet for kan du hjælpe med at rette det?
Avatar billede borsk Nybegynder
03. januar 2003 - 13:32 #14
jeg mente versionen er forskellig ikke forkert
Avatar billede martin_moth Mester
03. januar 2003 - 13:54 #15
Dim Versionsnummer as string
Versionsnummer = Str$(OSInfo.dwMajorVersion) + "." + LTrim(Str(OSInfo.dwMinorVersion))
Versionsnummer = trim(versionsnummer)

Select case versionsnummer
case "5.1"
  shell "xcopy x:\winXP.exe c:\programmer /C /I /Y"
case "5.0"
  shell "xcopy x:\win2000.exe c:\programmer /C /I /Y"
...
Avatar billede borsk Nybegynder
03. januar 2003 - 14:02 #16
Dim Versionsnummer As String
    Versionsnummer = Str$(OSInfo.dwMajorVersion) + "." + LTrim(Str(OSInfo.dwMinorVersion))
    Versionsnummer = Trim(Versionsnummer)

    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'KPDTeam@Allapi.net
    'Set the graphical mode to persistent
    Me.AutoRedraw = True
    'Set the structure size
    OSInfo.dwOSVersionInfoSize = Len(OSInfo)
    'Get the Windows version
    Ret& = GetVersionEx(OSInfo) <---
    'Chack for errors
    If Ret& = 0 Then MsgBox "Error Getting Version Information": Exit Sub
    'Print the information to the form

Nu ser toppen sådan ud, den laver fejl i den markerede linie "Byref argument type mismatch
Avatar billede martin_moth Mester
03. januar 2003 - 14:25 #17
Markerede linie?
Avatar billede borsk Nybegynder
03. januar 2003 - 14:30 #18
Ret& = GetVersionEx(OSInfo) <---

Undskyld ikke tydeligt nok, jeg havde lavet en lille pil (OSInfo) i overstående kommer den fejl jeg skrev før byref argument type mismatch
Avatar billede martin_moth Mester
03. januar 2003 - 14:34 #19
Private Sub Form_Load()
    Dim VersionsNummer As String
    Dim OSInfo As OSVERSIONINFO, PId As String
    OSInfo.dwOSVersionInfoSize = Len(OSInfo)
    Ret& = GetVersionEx(OSInfo)
    If Ret& = 0 Then MsgBox "Error Getting Version Information": Exit Sub
    VersionsNummer = Str$(OSInfo.dwMajorVersion) & "."
    VersionsNummer = VersionsNummer & LTrim(Str(OSInfo.dwMinorVersion))
    VersionsNummer = Trim(VersionsNummer)
    Select Case OSInfo.dwPlatformId
      Case 0
        MsgBox "xcopy x:\win32s.exe c:\programmer /C /I /Y"
      Case 1
        MsgBox "xcopy x:\win9X.exe c:\programmer /C /I /Y"
      Case 2
        Select Case VersionsNummer
          Case "5.0"
            MsgBox "xcopy x:\win2000.exe c:\programmer /C /I /Y"
          Case "5.1"
            MsgBox "xcopy x:\winXP.exe c:\programmer /C /I /Y"
      End Select
    End Select
    End
End Sub

Skift msgbox'ene ud med shell :o)
Avatar billede martin_moth Mester
03. januar 2003 - 14:37 #20
Jeg undrer mig over at du kaster dig over en sådan opgave, når du har nada erfaring med VB - er der ikke et sprog du kender, du kan bruge?
Avatar billede borsk Nybegynder
03. januar 2003 - 14:49 #21
Det undre også mig nogle gange.

Hele scriptet har jeg faktisk lavet om fra hvad det gjorde i begyndelsen, nu kopiere den ikke en fil men starter en service på pc'en istedet.

og den kører stadigvæk 2000 delen på en xp maskine. jeg paster lige hele scriptet igen.
Avatar billede borsk Nybegynder
03. januar 2003 - 14:50 #22
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

   

Private Sub Form_Load()

    network_drive = "s:"
    network_file = "s:\mercer koncept\it og infrastruktur\opgaver\udrulningsprogrammer\replikering af filbert\SyncPaths.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
 

    Dim VersionsNummer As String
    Dim OSInfo As OSVERSIONINFO, PId As String
    OSInfo.dwOSVersionInfoSize = Len(OSInfo)
    Ret& = GetVersionEx(OSInfo)
    If Ret& = 0 Then MsgBox "Error Getting Version Information": Exit Sub
    VersionsNummer = Str$(OSInfo.dwMajorVersion) & "."
    VersionsNummer = VersionsNummer & LTrim(Str(OSInfo.dwMinorVersion))
    VersionsNummer = Trim(VersionsNummer)
 

   
   
    If fso.FileExists(network_file) Then
            If fso.folderexists("c:\programmer") Then
                y = Shell("""c:\programmer\internet explorer\iexplore.exe"" http://intranet/filbert/default.asp", vbNormalFocus)
            Else
            y = Shell("""c:\program files\internet explorer\iexplore.exe"" http://intranet/filbert/default.asp", vbNormalFocus)
            End If
           
    Else
       
    Select Case OSInfo.dwPlatformId
        Case 0
           
           
            x = Shell("""net.exe ""start"" ""world wide web publishing""", vbNormalFocus)
           
                For i = 1 To 1000000
                Next
               
        Case 1
           
           
            x = Shell("""c:\windows\system\inetsrv\inetinfo.exe"" -e w3svc", vbNormalFocus)
             
        Case 2
             
           
            x = Shell("""C:\winnt\system32\net.exe ""start"" ""tjenesten til world wide web-udgivelse""", vbNormalFocus)
                For i = 1 To 1000000
                Next
    End Select
                 
            If fso.folderexists("c:\programmer") Then
                y = Shell("""c:\programmer\internet explorer\iexplore.exe"" http://localhost/filbert/default.asp", vbNormalFocus)
            Else
                y = Shell("""c:\program files\internet explorer\iexplore.exe"" http://localhost/filbert/default.asp", vbNormalFocus)
            End If
             
            End If
           
    'Print "OS: " + PId
    'Print "Win version:" + Str$(OSInfo.dwMajorVersion) + "." + LTrim(Str(OSInfo.dwMinorVersion))
    'Print "Build: " + Str(OSInfo.dwBuildNumber)
    End
   
End Sub
Avatar billede martin_moth Mester
03. januar 2003 - 15:05 #23
Har du nogle spørgsmål tilbage - eller hvorfor skulle jeg se din kode?
Avatar billede borsk Nybegynder
03. januar 2003 - 15:07 #24
Den tager 2000 Case istedet for XP case jeg satte en msgbox ind i hver case
Avatar billede martin_moth Mester
03. januar 2003 - 15:09 #25
Select Case OSInfo.dwPlatformId
  Case 0
    'kode til hvad du vil gøre hvis det er win32s
  Case 1
    'kode til hvad du vil gøre hvis det er win9x
  Case 2
    Select Case VersionsNummer
      Case "5.0"
        'kode til hvad du vil gøre hvis det er win2000
      Case "5.1"
        'kode til hvad du vil gøre hvis det er winXP
  End Select
End Select
Avatar billede martin_moth Mester
03. januar 2003 - 15:12 #26
Du har i øvrigt nogle mystiske ting i din kode

                For i = 1 To 1000000
                Next

??

Og hvad bruger du mon variablerne x og y til?

Nok om det - jeg har givet dig et "skelet, der virker - nu kan du fylde det ind i det du har lyst til.

Held og lykke :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester