wsh und Environment Variablen setzen und in Excel abrufen

  • #1
S

schauan

Mitglied
Themenersteller
Dabei seit
11.07.2005
Beiträge
6
Reaktionspunkte
0
Hallo,

ich habe ein Script welches unter NT4 und Excel 97 problemlos läuft. Das Script wird in abgemeldetem Zustand mittels taskSchedule unter meinem user ausgeführt.

Unter XP und Excel XP bekomme ich 2 verschiedene Varianten, eine läuft und eine nicht. Melde ich mich an und führe das Script aus, passt es, melde ich mich ab und starte es über die geplanten Aufträge geht es in die Hose ... Anscheinend werden die Variablen nicht so wie unter NT4 gesetzt sodass Excel diese im abgemeldeten Zustand nicht findet. Die 4 Typen habe ich begonnen zu testen, allerdings bekomme ich mit anderen Typen als PROCESS Probleme unter NT4.

Script (gekürzt):

Dim WshShell, WshEnv
Dim oExcel, oWbk
Dim fname
Set WshShell = WScript.CreateObject(WScript.Shell)
Set WshEnv = WshShell.Environment(PROCESS)
' Set WshEnv = WshShell.Environment(SYSTEM)
' Set WshEnv = WshShell.Environment(USER)
' Set WshEnv = WshShell.Environment(VOLATILE)

WshEnv (QS_MODE) = AUTO
fname= c:\test.xls

Set oExcel = CreateObject(Excel.Application)
oExcel.visible = true
Set oWbk = oExcel.Workbooks.Open (fname, false, true)
' If left(oExcel.Version,1) = 8 then
oExcel.Run test
' End If
oExcel.Quit
'--- ENDE ----
Set WshShell = nothing
Set WshEnv = nothing
Set oExcel = nothing
Set oWbk = nothing

In der test.xls ist nur ein winziges Makro:

Sub test()
MsgBox Environ(qs_mode)
End Sub

Hier wird mir dann der Environment-Wert AUTO ausgegeben.

Danke und Gruß, Andre
 
  • #2
Hallo,

nach weiteren Experimenten habe ich herausgefunden, dass unter NT im an- und abgemeldeten Zustand die PROCESS-Variable ausgelesen wird und unter XP im angemeldeten Zustand ebenfalls die PROCESS-Variable, im abgemeldeten Zustand allerdings die SYSTEM-Variable.
Das würde bedeuten, dass ich 2 Scripte benötige, 1x für NT und für XP angemeldet und 1x für XP nicht angemeldet. Kann man mit wsh feststellen, welches System läuft (NT4 - 2000 - XP) und ob der user bei Ausführung richtig angemeldet ist ? Wie gesagt, das script läuft im Task Scheduler unter dem Namen des users. Da es auf mehreren Rechnern läuft und natürlich etwas mehr tut  als hier dargestellt - es wird nicht nur eine Variable gesetz usw. -  wären 2 Scripte nicht gerade elegant oder einfacher zu bewerkstelligen. Bisher gibt es ein einheitliches script im Netz, da greifen alle zu, da ist das handling am einfachsten.

Anbei ein verbesserter code, die Meldung AUTO hilft nicht allzu viel ;-)

' wsh code Variante 1 (siehe Excel-Ergebnis):

Dim WshShell, WshEnv
Dim oExcel, oWbk
Dim fname

Set WshShell = WScript.CreateObject(WScript.Shell)

Set WshEnv = WshShell.Environment(PROCESS)
WshEnv (QS_MODE) = PROCESS

fname= c:\test.xls
Set oExcel = CreateObject(Excel.Application)
oExcel.visible = false
Set oWbk = oExcel.Workbooks.Open (fname, false, false)
oExcel.DisplayAlerts = False
oExcel.Run zaehler
WScript.sleep 60 * 1

WshEnv (QS_MODE) =

oExcel.Run zaehler
WScript.sleep 60 * 1
oWbk.save
WScript.sleep 60 * 10
oWbk.close
WScript.sleep 60 * 10
oExcel.Quit


Set WshShell = nothing
Set WshEnv = nothing
Set oExcel = nothing
Set oWbk = nothing

'---    ENDE  V1  ----


' wsh code Variante 2 (siehe Excel-Ergebnis):

Dim WshShell, WshEnv
Dim oExcel, oWbk
Dim fname

Set WshShell = WScript.CreateObject(WScript.Shell)

fname= c:\test.xls


Set WshEnv = WshShell.Environment(PROCESS)
WshEnv (QS_MODE) = PROCESS
Set oExcel = CreateObject(Excel.Application)
oExcel.visible = true
Set oWbk = oExcel.Workbooks.Open (fname, false, false)
oExcel.DisplayAlerts = False
oExcel.Run zaehler
WScript.sleep 60 * 1
oWbk.save
WScript.sleep 60 * 10
oWbk.close
WScript.sleep 60 * 10
oExcel.Quit
Set WshEnv = nothing
Set oExcel = nothing
Set oWbk = nothing

Set WshEnv = WshShell.Environment(SYSTEM)
WshEnv (QS_MODE) = SYSTEM
Set oExcel = CreateObject(Excel.Application)
oExcel.visible = true
Set oWbk = oExcel.Workbooks.Open (fname, false, false)
oExcel.DisplayAlerts = False
oExcel.Run zaehler
WScript.sleep 60 * 1
oWbk.save
WScript.sleep 60 * 10
oWbk.close
WScript.sleep 60 * 10
oExcel.Quit
Set WshEnv = nothing
Set oExcel = nothing
Set oWbk = nothing

Set WshEnv = WshShell.Environment(USER)
WshEnv (QS_MODE) = USER
Set oExcel = CreateObject(Excel.Application)
oExcel.visible = true
Set oWbk = oExcel.Workbooks.Open (fname, false, false)
oExcel.DisplayAlerts = False
oExcel.Run zaehler
WScript.sleep 60 * 1
oWbk.save
WScript.sleep 60 * 10
oWbk.close
WScript.sleep 60 * 10
oExcel.Quit
Set WshEnv = nothing
Set oExcel = nothing
Set oWbk = nothing

Set WshEnv = WshShell.Environment(VOLATILE)
WshEnv (QS_MODE) = VOLATILE
Set oExcel = CreateObject(Excel.Application)
oExcel.visible = true
Set oWbk = oExcel.Workbooks.Open (fname, false, false)
oExcel.DisplayAlerts = False
oExcel.Run zaehler
WScript.sleep 60 * 1
oWbk.save
WScript.sleep 60 * 10
oWbk.close
WScript.sleep 60 * 10
oExcel.Quit
Set oExcel = nothing
Set oWbk = nothing

Set WshEnv = WshShell.Environment(VOLATILE)
WshEnv (QS_MODE) =
Set WshEnv = WshShell.Environment(USER)
WshEnv (QS_MODE) =
Set WshEnv = WshShell.Environment(SYSTEM)
WshEnv (QS_MODE) =
Set WshEnv = WshShell.Environment(PROCESS)
WshEnv (QS_MODE) =

Set WshShell = nothing
Set WshEnv = nothing

'---    ENDE  V2  ----

Excel:
Sub zaehler()
Application.DisplayAlerts = False
[a1] = [a1] + 1
Sheets(1).Cells(Sheets(1).Cells(Sheets(1).Rows.Count, 1).End(xlUp).Row + 1, 1) = Environ(QS_MODE) & [a1]
End Sub

Ergebnis in Excel:
13
Variante 1 - angemeldet, nur Variable PROCESS gesetzt
PROCESS2
PROCESS3
Variante 2 - angemeldet, alle Variablen nacheinander gesetzt und ausgelesen
PROCESS4
PROCESS5
PROCESS6
PROCESS7
Variante 1 - abgemeldet, nur Variable PROCESS gesetzt
SYSTEM8
SYSTEM9
Variante 2 - abgemeldet, alle Variablen nacheinander gesetzt und ausgelesen
SYSTEM10
SYSTEM11
SYSTEM12
SYSTEM13
 
  • #3
Ich denk mal die Antworten liegen in der Registry. Mit dem Programm RegShot () kannst Du nach Unterschieden suchen (angemeldet/nicht angemeldet).
Welches OS läuft, sieht man z.B. bei Win98 unter HKCU\Software\Liter\CurrentVersion. Wenn Dus bei NT x nicht dort findest, suche einfach mal im RegistryEditor nach der Builtnummer (unter Eigenschaften von System) des jeweiligen OS.
 
  • #4
Hallo Filtro,
wie kann ich das denn fernsteuern? In den Releasenotes und der Readme steht dazu nix. Ich habe lediglich die Option -path gefunden. Wenn ich das Tool damit von der Kommandozeile aus starte habe ich den Pfad auch in der Auswahl. Dass nutzt mir aber nichts. Da ich den Zustand Abgemeldet und Angemeldet vergleichen will muss das Ding von meinem Script aus laufen, ich brauche also auch Optionen für den 1Shut, 2Shut, ... , da ist nix beschrieben. Wie geht das?
Grüße, Andre
 
  • #5
Hi!

Ich meinte was anderes! Du sollst das Tool benutzen, um vorher von Hand zu recherchieren, an welchen Registryeinträgen Du erkennen kannst, ob Du an- oder abgemeldet bist. Dein Skript soll nachher dann nur noch den entsprechenden Eintrag auswerten.
 
Thema:

wsh und Environment Variablen setzen und in Excel abrufen

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.839
Beiträge
707.962
Mitglieder
51.492
Neuestes Mitglied
Janus36
Oben