coldzero89
Goto Top

CSV in XLSX mit OpenOffice und VBS und das ganze in meine Batchscript, das die Datei per Mail versendet

Datein werden Exportiert als CSV und werden dann per Mail versendet. Diese werden aber als XLSX benötigt

Ja Moin Moin,

also wie im Vorwort geht es darum, das ich ein Batchscript habe, das die exportierte CSV Datei versendet.

Bisher isses dann so, das die Datei abgespeichert wurd und als XLSX neu gespeichert wird - unnötiger Arbeitsschritt der vor dem Abschicken bereits geschehen kann.

Problem 1. MSOffice ist auf dem PC nicht installiert, nur OpenOffice in der aktuellsten Version.
Problem 2. Habe ich wenig ahnung von VBS UND bin zwar drauf gestoßen wie das schick zu lösen ist, aber wie geht das unter OpenOffice?

Hoffe ihr könnt mir helfen. Würd das ganze dann in mein Batch einbauen (das weiß ich dank Bastla wie das geht).

Danke im Vorraus.

Gruß Zero

Content-Key: 187593

Url: https://administrator.de/contentid/187593

Printed on: April 18, 2024 at 00:04 o'clock

Member: rubberman
rubberman Jul 07, 2012 at 00:46:41 (UTC)
Goto Top
Hallo ColdZero89.

Es wäre mir neu, dass man mit OOo im XLSX Format speichern kann. XLS sollte aber funktionieren. Ich bin nicht der OOo Experte, da ich beruflich ausschließlich mit M$ Office zu tun habe.
Kurzerhand zusammen geschrieben, aber nur unzureichend getestet:
Dim i, arrProp(1), oSvcMan, oDsktp, oDoc

Const sCsvURL     = "file:///C:/pfad/test.csv"  
Const sXlsURL     = "file:///C:/pfad/test.xls"  

Set oSvcMan       = WScript.CreateObject("com.sun.star.ServiceManager")  
Set oDsktp        = oSvcMan.createInstance("com.sun.star.frame.Desktop")  

For i = 0 To UBound(arrProp)
  Set arrProp(i)  = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
Next

arrProp(0).Name   = "FilterName"  
arrProp(0).Value  = "Text - txt - csv (StarCalc)"  
arrProp(1).Name   = "FilterOptions"  
arrProp(1).Value  = "59,34,ANSI,1,"  
Set oDoc          = oDsktp.loadComponentFromURL(sCsvUrl, "_blank", 0, arrProp)  

arrProp(0).Value  = "MS Excel 97"  
arrProp(1).Name   = ""  
arrProp(1).Value  = ""  
oDoc.storeAsURL sXlsURL, arrProp

oDoc.close(True)
oDsktp.terminate

For i = 0 To UBound(arrProp)
  Set arrProp(i)  = Nothing
Next
Set oDoc          = Nothing
Set oDsktp        = Nothing
Set oSvcMan       = Nothing
Beachte dass Pfadangaben im URL Format stehen müssen!

Grüße
rubberman
Mitglied: 76109
76109 Jul 07, 2012 updated at 09:56:16 (UTC)
Goto Top
Hallo rubberman!

Tolles Skriptface-smile

Es wäre mir neu, dass man mit OOo im XLSX Format speichern kann
Habe mir die aktuelle OO-Version auf meinen virtuellen PC installiert und kann zum einen bestätigen, dass es funktioniert und zum anderen, dass (max) nur ein 97er *.xls-Format erstellt werden kannface-wink

Gibt's auch ne Möglichkeit, die Konvertierung mit Visible = False auszuführen und wie müsste dass arrProp definiert sein, wenn ich eine *.ods-Datei in's *.xls-Format konvertieren möchte?

Gruß Dieter
Member: rubberman
rubberman Jul 07, 2012 at 13:16:31 (UTC)
Goto Top
Hallo Dieter,

danke für die Blumen face-wink

Zu deinen Fragen:
"Hidden" gehört zu den Eigenschaften, die beim Öffnen eines Dokuments festgelegt werden können. Ordne einen booleschen Wert zu.
Dim i, arrProp(2), oSvcMan, oDsktp, oDoc

Const sCsvURL     = "file:///C:/pfad/test.csv"  
Const sXlsURL     = "file:///C:/pfad/test.xls"  

Set oSvcMan       = WScript.CreateObject("com.sun.star.ServiceManager")  
Set oDsktp        = oSvcMan.createInstance("com.sun.star.frame.Desktop")  

For i = 0 To UBound(arrProp)
  Set arrProp(i)  = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
Next

arrProp(0).Name   = "Hidden"  
arrProp(0).Value  = True
arrProp(1).Name   = "FilterName"  
arrProp(1).Value  = "Text - txt - csv (StarCalc)"  
arrProp(2).Name   = "FilterOptions"  
arrProp(2).Value  = "59,34,ANSI,1,"  
Set oDoc          = oDsktp.loadComponentFromURL(sCsvUrl, "_blank", 0, arrProp)  

arrProp(1).Value  = "MS Excel 97"  
arrProp(2).Name   = ""  
arrProp(2).Value  = ""  
oDoc.storeAsURL sXlsURL, arrProp

oDoc.close(True)
oDsktp.terminate

For i = 0 To UBound(arrProp)
  Set arrProp(i)  = Nothing
Next
Set oDoc          = Nothing
Set oDsktp        = Nothing
Set oSvcMan       = Nothing

Für ODS Dateien reicht dann die Hidden Eigenschaft bereits zum Öffnen (bzw. ein leeres Array, wenn du keine weiteren Properties festlegen willst).
Dim i, arrProp(1), oSvcMan, oDsktp, oDoc

Const sOdsURL     = "file:///C:/pfad/test.ods"  
Const sXlsURL     = "file:///C:/pfad/test.xls"  

Set oSvcMan       = WScript.CreateObject("com.sun.star.ServiceManager")  
Set oDsktp        = oSvcMan.createInstance("com.sun.star.frame.Desktop")  

For i = 0 To UBound(arrProp)
  Set arrProp(i)  = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
Next

arrProp(0).Name   = "Hidden"  
arrProp(0).Value  = True
Set oDoc          = oDsktp.loadComponentFromURL(sOdsUrl, "_blank", 0, arrProp)  

arrProp(1).Name   = "FilterName"  
arrProp(1).Value  = "MS Excel 97"  
oDoc.storeAsURL sXlsURL, arrProp

oDoc.close(True)
oDsktp.terminate

For i = 0 To UBound(arrProp)
  Set arrProp(i)  = Nothing
Next
Set oDoc          = Nothing
Set oDsktp        = Nothing
Set oSvcMan       = Nothing

Grüße
rubberman
Mitglied: 76109
76109 Jul 07, 2012 updated at 14:56:25 (UTC)
Goto Top
Hallo rubberman!

Superface-smile Und vielen Dank für Deine Mühe!

Grüße und ein schönes Wochendende

Dieter
Member: ColdZero89
ColdZero89 Jul 09, 2012 at 09:18:32 (UTC)
Goto Top
Moin,

Wow ich danke dir. Ich versteh zwar nur die hälfte, bzw. kann mir einige dinge zusammenreimen aber sieht seeeehr interessant aus.

Werd ich die Tage mal ausprobieren, momentan schlecht da unterbesetzt.

Danke für deine Mühen und @Didi: Sehr schön das auch scheinbar auch dir damit geholfen ist :D

Gruß Zero
Member: rubberman
rubberman Jul 09, 2012 at 17:30:12 (UTC)
Goto Top
Hallo ColdZero89.

Zitat von @ColdZero89:
Ich versteh zwar nur die hälfte

Kann ich nachvollziehen face-wink Von dem Script ist auch nicht mal die Hälfte VBScript. Vorwiegend sind es Methoden und Eigenschaften der referenzierten OOo Objekte.


@Dieter

Nachdem ich noch ein bisschen herum experimentiert habe, ist es öfters passiert, dass der OOo Menüdesktop trotzdem für Sekunden oder Sekundenbruchteile sichtbar war. Ist auch kein Wunder, da die Hidden Eigenschaft ja erst beim Öffnen des Dokuments gesetzt wird.
Folgende Änderung des Codes beruht auf:
- der Tatsache, dass soffice.exe mit der Option -invisible ohne GUI startet.
- der Beobachtung/Annahme, dass mehrere Instanzen des OOo Desktops unter nur einem bereits gestarteten soffice.exe Process laufen.
Option Explicit

Dim i, iRet, iPID
Dim sExe, sExePath
Dim arrProp(2)
Dim oReg, oFSO, oWMI, oStartup, oConfig, oProcess, colProc, oSvcMan, oDsktp, oDoc

Const sCsvPath      = "test.csv"  
Const sXlsPath      = "test.xls"  

Const iHKLM        = &h80000002
Const sKey         = "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\soffice.exe"  
Const sVal         = ""  
Const sComp        = "."  
Const iSleep       = 2000
Const SW_HIDE      = 0

''' OOo Starten (hidden) '''''''''''''''''''''''''''''''''''''''''''''''''''''''  

' Wo ist OOo installiert? (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\soffice.exe)  
Set oReg           = GetObject( _
  "winmgmts:{impersonationLevel=impersonate}!\\" & sComp & "\root\default:StdRegProv")  
oReg.GetStringValue iHKLM, sKey, sVal, sExe
Set oReg           = Nothing

If IsNull(sExe) Then WScript.Quit

' OOo Arbeitsverzeichnis  
Set oFSO           = CreateObject("Scripting.FileSystemObject")  
sExePath           = oFSO.GetParentFolderName(sExe)
Set oFSO           = Nothing

' OOo ohne GUI öffnen.  
Set oWMI           = GetObject _
  ("winmgmts:{impersonationLevel=impersonate}!\\" & sComp & "\root\cimv2")  
Set oStartup       = oWMI.Get("Win32_ProcessStartup")  
Set oConfig        = oStartup.SpawnInstance_
oConfig.ShowWindow = SW_HIDE
Set oProcess       = oWMI.Get("Win32_Process")  
iRet               = oProcess.Create _
  (sExe & " -invisible", sExePath, oConfig, iPID) ' Option -invisible ist erforderlich!  

Set oProcess       = Nothing
Set oConfig        = Nothing

If iRet > 0 Then WScript.Quit

' Auf Prozess "soffice.bin" warten und sicherstellen dass er vollständig geladen ist.  
Do
  Set colProc      = oWMI.ExecQuery( _
    "Select * from Win32_Process Where Caption = 'soffice.bin' " & _  
    "And ParentProcessID = '" & CStr(iPID) & "'")  
  For Each oProcess In colProc
    Exit Do
  Next
  WScript.Sleep 300
Loop
WScript.Sleep iSleep

Set oProcess       = Nothing
Set colProc        = Nothing
Set oWMI           = Nothing

''' CSV zu XLS '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  

' OOo ServiceManager  
Set oSvcMan        = WScript.CreateObject("com.sun.star.ServiceManager")  

' OOo Menü - Desktop  
Set oDsktp         = oSvcMan.createInstance("com.sun.star.frame.Desktop")  

' OOo Property - Struct  
For i = 0 To UBound(arrProp)
  Set arrProp(i)   = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
Next

' Properties für das Öffnen der CSV Datei.  
arrProp(0).Name    = "Hidden"  
arrProp(0).Value   = True
arrProp(1).Name    = "FilterName"  
arrProp(1).Value   = "Text - txt - csv (StarCalc)"  
arrProp(2).Name    = "FilterOptions"  
' Delimiter ';' (59), Texttrenner '"' (34), Zeichensatz ANSI, Start in Zeile 1  
arrProp(2).Value   = "59,34,ANSI,1,"  
Set oDoc           = oDsktp.loadComponentFromURL( _
  ToOOFileURL(sCsvPath), "_blank", 0, arrProp)  

' Properties für das Speichern als XLS Datei.  
arrProp(1).Value   = "MS Excel 97"  
arrProp(2).Name    = ""  
arrProp(2).Value   = ""  
oDoc.storeAsURL ToOOFileURL(sXlsPath), arrProp

' Dokument schließen  
oDoc.close(True)
' OOo schließen  
oDsktp.terminate

' Speicher freigeben  
For i = 0 To UBound(arrProp)
  Set arrProp(i)   = Nothing
Next
Set oDoc           = Nothing
Set oDsktp         = Nothing
Set oSvcMan        = Nothing

''' Windows Pfadangabe zu OOo File URL '''''''''''''''''''''''''''''''''''''''''  

Function ToOOFileURL(sPath)
' Absolute Pfade oder Pfade relativ zum Script werden entsprechend konvertiert.  
' OOo hält sich nicht an die Restriktionen in RFC 1738. Weniger ist hier mehr.  
  ToOOFileURL      = "file:///" & Replace(Replace(Replace( _  
    CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(sPath), _  
    "\", "/"), "%", "%25"), " ", "%20")  
End Function
Wie du siehst gibt es nun auch die Funktion ToOOFileURL(). Somit kannst du wie gewohnt mit Windows Pfadangaben arbeiten. Relative Pfade werden entsprechend erweitert.

Grüße
rubberman
Mitglied: 76109
76109 Jul 09, 2012 updated at 18:02:38 (UTC)
Goto Top
Hallo rubberman!

Nachdem ich noch ein bisschen herum experimentiert habe, ist es öfters passiert,
dass der OOo Menüdesktop trotzdem für Sekunden oder Sekundenbruchteile sichtbar war.
Ist auch kein Wunder, da die Hidden Eigenschaft ja erst beim Öffnen des Dokuments gesetzt wird.
Ist ja bei Excel auch nicht anders, es sei denn, man lädt die Excel-Datei mit GetObject, was allerdings auch nur zum Lesen (.Close False) einer Excel-Datei geeignet ist. Beim Speichern und erneutem Öffnen sind die Excel-Einstellungen zum Großteil futschface-wink

Dein (WOW)-Skript muss ich mir erstmal in Ruhe zu Gemüte führenface-wink

Bei meinen Testereien ist mir in dieser Hinsicht nix aufgefallen und wenn, dann ist der Umstand wohl vernachlässigbarface-wink

Danke für Deine Mühe!

Gruß Dieter
Mitglied: 76109
76109 Jul 09, 2012 at 22:10:46 (UTC)
Goto Top
Hallo rubberman!

' Wo ist OOo installiert? (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\soffice.exe)
Da ist bei mir keine soffice.exe zu finden, da Office nur unter Current-User installiert istface-wink

Zum ermitteln des Pfades verwende ich folgenden Code:
Const sComputer = "."  
Const sSql_OpenOffice = "SELECT Version FROM Win32_Product WHERE Name Like 'OpenOffice%'"  

Const iHKCU = &H80000001
Const iHKLM = &H80000002

Const sRegKey = "Software\OpenOffice.org\"  
Const sRegVal = "Path"  

    Dim oWMI, oItem, sProduktName, sKey, sExePath
    
    Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\CIMV2")  
    
    For Each oItem In oWMI.ExecQuery(sSql_OpenOffice)
        sProduktName = oItem.Name
    Next
        
    sKey = sRegKey & Replace(sProduktName, " ", "\")  
    
    With GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\default:StdRegProv")  
        .GetStringValue iHKCU, sKey, sRegVal, sExePath
    End With

Gruß und gute Nacht

Dieter
Member: rubberman
rubberman Jul 09, 2012 at 22:41:47 (UTC)
Goto Top
Hallo Dieter,

danke für die Info. An diese Möglichkeit hatte ich gar nicht gedacht.
Leider ist es bei mir so, dass Daten über die Win32_Product Klasse zu selektieren, mehrere Minuten dauert face-sad Da muss ich noch mal in mich gehen. Vielleicht fällt mir 'ne Alternative ein.

Grüße
rubberman
Mitglied: 76109
76109 Jul 10, 2012 updated at 21:28:31 (UTC)
Goto Top
Hallo rubberman!

Hm.., bei mir geht's Ratzfatz. Liegt wohl daran, dass auf meinem XP-Mode nicht viel installiert istface-wink

Es geht aber auch so:
Const sComputer = "."  

Const iHKCR = &H80000000
Const iHKCU = &H80000001
Const iHKLM = &H80000002
Const iHKUS = &H80000003

Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"  
Const sRegValue = "Path"  
    
    Dim oReg, oSubKey, aRegValues, sExePath
    
    Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _  
                          sComputer & "\root\default:StdRegProv")  
    
    oReg.EnumKey iHKCU, sRegKey, aRegValues
        
    If IsArray(aRegValues) Then
        If IsNumeric(aRegValues(0)) Then
           oReg.GetStringValue iHKCU, sRegKey & aRegValues(0), sRegValue, sExePath
        End If
    End If
        
    MsgBox sExePath

Gruß Dieter

[edit] einen kleinen Fehler entdeckt und geändert [/edit]
Member: ColdZero89
ColdZero89 Jul 10, 2012 at 08:26:32 (UTC)
Goto Top
Moin,

kurze anmerkung: Ihr seid Verrückt.
Und rubberman von deinem Monstösem Script - versteh ich nun vielleicht einen bruchteil... Ich kann teilweise GROB zuordnen was wofür steht und was es macht... aber herrjeh! Mir raucht der Kopf!

Am WE mal angucken und verstehen + nächste Woche testen und dann, wenns klappt, als Gelöst markieren.

Gruß Zero
Mitglied: 76109
76109 Jul 10, 2012 at 09:18:26 (UTC)
Goto Top
Hallo ColdZero89!

kurze anmerkung: Ihr seid Verrückt.
Das sind doch nur Spielereienface-wink und es geht eigentlich nur darum, den Prozess völlig im Hintergrund auszuführen. In den vorigen Skripts greift die Option Hidden erst, nachdem OpenOffice schon geöffnet wurde und jenachdem, wie lange das dauert, kann es sein, dass das Fenster für eine kurze Zeit sichtbar wird. Im letzten Skript hingegen, wird OpenOffice durch den Prozess-Manager im Hintergrund gestartet und bleibt somit unsichtbar. Allerdings ist der Aufwand dafür nicht gerade unerheblich, da ja u.a. auch ersteinmal der direkte Pfad der OpenOffice-Exe ermittelt werden muss...

Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 10, 2012 updated at 11:36:05 (UTC)
Goto Top
Moin,

Spielereien? Oo Spielereien sind für mich wenn ich ne Stickstoffkühlung auf meinen CPU baue und den Übertakte, aber doch nicht so ein WirrWar face-big-smile
/OT
Gut ich bin eben ehr der Hardware Mensch, der aus sämtlichen teilen noch nen super Office PC - oder je nach teilen - auch gaming PC zusammenbastelt oder einfach mal ein wenig CaseModding betreibt - wie demnächst geplant in mein CD Regal x)
/OT

Aber ok........ *hust* belassen wir es bei Spielereien.

Was mir noch einfällt, was unerwähnt geblieben ist: Die Ausgangsdatei EXISTIERT jedesmal vom Namen her schon und muss überschrieben werden. Rattert der das so durch oder muss da nun noch ne Zeile hinzu?

Gruß Zero
Mitglied: 76109
76109 Jul 10, 2012 at 14:50:44 (UTC)
Goto Top
Hallo ColdZero89!

Naja, ich bin ja durch und durch ein Handwerker und übe auch einen Handwerksberuf (Schwerstarbeit) aus. Mit IT und/oder Programmierung habe ich ansich nix zu tun. Deshalb ist es für mich eine Spielerei nach dem Motto 'Wer lesen kann ist im Vorteil..', um in meinem Alter mental noch halbwegs fit zu bleibenface-wink

Was mir noch einfällt, was unerwähnt geblieben ist: Die Ausgangsdatei EXISTIERT jedesmal vom Namen her schon und muss überschrieben werden. Rattert der das so durch oder muss da nun noch ne Zeile hinzu?
Wie jetze? Wieso existiert die Datei schon?

Du Konvertierst doch von *.csv nach *.xls. Ansonsten könnte man sich ja das ganze sparen, wenn du schon eine *.xls-Datei hättest?face-wink

Gruß Dieter
Member: rubberman
rubberman Jul 10, 2012 updated at 23:40:10 (UTC)
Goto Top
@Dieter

das sieht doch gut aus. Das ganze noch in eine Funktion geworfen, und schon wird's für uns beide und hoffentlich auch für andere funktionieren.
Option Explicit

Const iHKCU                = &H80000001
Const iHKLM                = &H80000002

Dim sExe

sExe                       = GetSofficeExePath(iHKCU)
If IsEmpty(sExe) Then sExe = GetSofficeExePath(iHKLM)
If IsEmpty(sExe) Then WScript.Quit 1

MsgBox sExe

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  
Function GetSofficeExePath(iHKey)
  Const sRegKey     = "Software\OpenOffice.Org\OpenOffice.Org\"  
  Const sRegValue   = "Path"  
  Const sComputer   = "."  
        
  Dim oReg, aRegValues, sExePath
        
  Set oReg          = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _  
                                & sComputer & "\root\default:StdRegProv")  
        
  oReg.EnumKey iHKey, sRegKey, aRegValues
        
  If IsArray(aRegValues) Then
    If IsNumeric(aRegValues(0)) Then
      oReg.GetStringValue iHKey, sRegKey & aRegValues(0), sRegValue, sExePath
    End If
  End If

  Set oReg          = Nothing

  GetSofficeExePath = sExePath
End Function
[EDIT]... und Dieters Korrektur nachgezogen[/EDIT]


@ColdZero89
[OT]
Zitat von @ColdZero89:
Spielereien sind für mich wenn ich ne Stickstoffkühlung auf meinen CPU baue und den Übertakte

Brrrr... Bei solchen Temperaturen übertaktet mein Zähneklappern schon beim Lesen face-smile
Die Hardware an der ich (berufsbedingt) herumbastle ist nicht so "hard", wie mein Nickname bereits vermuten lässt. Das Ganze hat auch eher was mit höheren Temperaturen zu tun.
Ich hoffe du nimmst es Dieter und mir nicht übel, wenn wir deinen Thread für ein wenig Geplänkel rund um's Thema missbrauchen face-wink
[/OT]

Zitat von @ColdZero89:
Die Ausgangsdatei EXISTIERT jedesmal vom Namen her schon und muss überschrieben werden. Rattert der das so durch oder muss da nun noch ne Zeile hinzu?

Am Script solls nicht liegen und OOo hat auch keine Probleme damit. Das Problem würde (wie so oft) vor dem Rechner sitzen, nämlich wenn die Datei mit Calc oder Excel geöffnet und somit gesperrt ist.

Grüße
rubberman
Mitglied: 76109
76109 Jul 10, 2012 updated at 21:18:00 (UTC)
Goto Top
Hallo rubberman!

Beim Durchlesen Deines Postes ist mir ein kleiner Fehler aufgefallen und zwar müsste (in meinem Code schon geändert) bei Dir die Codezeile 31 etwas nach oben in den IsNumeric-Block, wobei man sich die sKey-Variable dann auch gleich sparen kannface-wink

Ist Dir wohl nicht aufgefallen?face-wink

Gruß Dieter
Member: rubberman
rubberman Jul 10, 2012 at 23:14:18 (UTC)
Goto Top
Hallo Dieter!

Zitat von @76109:
Ist Dir wohl nicht aufgefallen?face-wink

Nö, im Gegenteil. Beim ersten Durchlesen des Codes sah es mir so aus als würdest du darauf hinaus wollen letztlich die höchste Versionsnummer in Variable sKey zu haben. Keine Ahnung, wie ich darauf gekommen bin. Natürlich könnte man über aRegValues iterieren und prüfen ob es mehrere Versionen gibt. Das ist aber unsinnig, da bei Installation von OOo die vorherige Version deinstalliert wird. Ergo: es genügt völlig aRegValues(0) als Maß der Dinge anzunehmen.
Danke für das Update. Ich passe die Funktion entsprechend an.

Grüße
rubberman
Member: ColdZero89
ColdZero89 Jul 11, 2012 updated at 09:25:10 (UTC)
Goto Top
Moin,

bezahlt ihr mir eine Dnustabzugshaube? Ich mein ich kenne das ganze von nicht ITlern wenn man da anfängt von der GPU und ach ka zu reden und denen der Kopf raucht, aber wenn ich mir das hier durchlese... da brennen mir sämtliche gehirnzellen wegen überhitzung durch face-big-smile

Und nein an sich kein Problem solange ihr beschreibt was ihr geändert habt und so damit auch jeder außenstehende das nachvollziehen kann - ich kansn nämlich nicht mehr face-big-smile

Die Datei wird auf dem NB wo es ausgeführt wird NICHT geöffnet sein.

Exportieren -> Verarbeiten -> Auf dem anderen PC - bei dem die E-Mail ankam - aufs Netzlaufwerk schieben.

Was ich mich nun frage: Wie in aller Welt bekomm ich DAS in mein Batch unter? Vorallem läuft das mit der Endung VBS? Wenn ja dann weiß ich wie ich das aufrufe und die Butter is gegessen, aber wenn nicht dann bildet mein Kopf gleich ein grooooßes ? ab x)
Herrlich hier wieder :D

Gruß Zero

Edit: Vorallem dieser Sprung von diesem "großen" Script zu einer Arg kurzen fassung - wie gesagt wäre lieb wenn ihr da zumindestens erklären könntet was verändert wurde und was das script mit dieser veränderung bewirken soll, so verstehen zumindestens laien auch ein wenig was ihr hier für "Spielerein" treibt :D
Mitglied: 76109
76109 Jul 11, 2012 at 13:21:27 (UTC)
Goto Top
Hallo ColdZero89!

Achso! Und ich dachte, dass bei Dir schon alles läuftface-smile

Habe mal was mit rubbermans Anfangs-Script zusammengebastelt, damit Du auch was zum spielen hast:
'Aufrufbeispiele über Batch:  

'Eine Csv-/Text-Datei [csv, txt]  
'@cscript //nologo "E:\Test\ConvertCsvToXls.vbs" "E:\Test\Test.csv"  

'Mehrere Csv-/Text-Dateien [csv, txt]  
'@cscript //nologo "E:\Test\ConvertCsvToXls.vbs" "E:\Test\*.csv"  

'Main Beg  
    Dim oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile
    
    Set oArgs = WScript.Arguments
    
    If oArgs.Count <> 1 Then
        WScript.Echo "Falsche Anzahl an Argumenten!":  WScript.Quit 1  
    End If
        
    sSrcFile = oArgs(0)
    
    Set oFso = CreateObject("Scripting.FileSystemObject")  
        
    sExtName = oFso.GetExtensionName(sSrcFile)
    
    If LCase(sExtName) <> "csv" And LCase(sExtName) <> "txt" Then  
        WScript.Echo "Falscher Dateityp [csv, txt]!":  WScript.Quit 1  
    End If
    
    sBaseName = oFso.GetBaseName(sSrcFile)
    sFolder = oFso.GetParentFolderName(sSrcFile)
    
    If sBaseName = "*" Then  
        For Each oFile In oFso.GetFolder(sFolder).Files
            If LCase(oFso.GetExtensionName(oFile)) = sExtName Then
                sBaseName = oFso.GetBaseName(oFile)
                sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")  
                Call ConvertCsvToXls(oFile.Path, sDstFile)
            End If
        Next
    ElseIf Not oFso.FileExists(sSrcFile) Then
        WScript.Echo "Quell-Datei nicht gefunden!":  WScript.Quit 1  
    Else
        sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")  
        Call ConvertCsvToXls(sSrcFile, sDstFile)
    End If

    Set oFso = Nothing
    
    WScript.Echo "Fertig!":  WScript.Quit 0  

'Main End  

Private Sub ConvertCsvToXls(ByRef sCsvFile, sXlsFile)
    Dim oSvcMan, oDsktp, oDoc, aProp(2), i, sCsvURL, sXlsURL
    
    sCsvURL = "file:///" & Replace(sCsvFile, "\", "/")  
    sXlsURL = "file:///" & Replace(sXlsFile, "\", "/")  
    
    Set oSvcMan = CreateObject("com.sun.star.ServiceManager")  
    Set oDsktp = oSvcMan.createInstance("com.sun.star.frame.Desktop")  
    
    For i = 0 To UBound(aProp)
      Set aProp(i) = oSvcMan.Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
    Next
    
    aProp(0).Name = "Hidden"  
    aProp(0).Value = True
    aProp(1).Name = "FilterName"  
    aProp(1).Value = "Text - txt - csv (StarCalc)"  
    aProp(2).Name = "FilterOptions"  
    aProp(2).Value = "59,34,ANSI,1,"  
    
    Set oDoc = oDsktp.loadComponentFromURL(sCsvURL, "_blank", 0, aProp)  
    
    aProp(1).Value = "MS Excel 97"  
    aProp(2).Name = ""  
    aProp(2).Value = ""  
    
    oDoc.storeAsURL sXlsURL, aProp
    
    oDoc.Close False
    oDsktp.Terminate
    
    For i = 0 To UBound(aProp)
      Set aProp(i) = Nothing
    Next
    
    Set oDoc = Nothing
    Set oDsktp = Nothing
    Set oSvcMan = Nothing
End Sub

Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 11, 2012 at 14:00:05 (UTC)
Goto Top
Moin und danke Dieter,

nein eben nicht werde die Woche nicht dazu kommen das zu testen aber nächste Woche.

Also ohne >> schnick aufrufen und das Temporär in ne vbs Datei reinschreiben und die dann aufrufen - gut.

Und per cscript die VBS sowie die zu bearbeitende Date (csv) aufrufen.
Alles klärchen. Nun noch einigermaßen durch das Script steigen und es verstehen und ich bin happy ^-^

Danke euch beiden schonmal vielmals =)

Gruß Zero
Member: rubberman
rubberman Jul 11, 2012 at 17:07:40 (UTC)
Goto Top
Hallo ColdZero89.

Mal noch 'ne Randnotiz von meiner Seite ...
Zitat von @ColdZero89:
Was ich mich nun frage: Wie in aller Welt bekomm ich DAS in mein Batch unter?

Wenn ich das lese, frage ich mich was anderes ... was in aller Welt machst du eigentlich noch mit deiner Batchdatei? Ohne nun deine vorangegangenen Threads im Detail studiert zu haben, ist mir aufgefallen, dass du so ziemlich alles in VBScript erledigst. Du benutzt die Batchdatei um ein VBScript zu schreiben und anschließend aufzurufen - öhm ... Wo klemmt's eigentlich noch, um das nicht gleich ganz per VBS zu verwursten? Oder gibt es da einen speziellen Grund?

Grüße
rubberman
Member: ColdZero89
ColdZero89 Jul 12, 2012 at 09:16:50 (UTC)
Goto Top
Moin,

ich drücke es mal so aus: Am liebsten würde ich alles in Batch erledigen. Bin aber Aufgrund von zu wenig Möglichkeiten in Batch dazu gezwungen VBS zu nutzen.

Hintergrund dazu ist: Das ich nicht 2 oder 3 Scripte will, sondern eines. Da die Verarbeitung (Umbenennen, Kopieren, etc) in Batch stattfindet, bau ich das VBS dann in die Batch ein. Bei Batch kenn ich zum größten Teil die Möglichkeiten die ich habe und den Umfang den ich damit Erreichen kann. Daher das ganze in eine Batch verpackt.

Gruß Zero
Member: rubberman
rubberman Jul 12, 2012 at 21:46:30 (UTC)
Goto Top
Hallo Zero.

Zitat von @ColdZero89:
Hintergrund dazu ist: Das ich nicht 2 oder 3 Scripte will, sondern eines.
... und genau darauf wollte ich hinaus. Letztlich hast du mehrere Scripts (ob du sie nun aus dem Batch erst erstellst oder gleich parallel liegen hast ändert nichts an der Tatsache face-wink). Umbenennen und Kopieren ist mit VBS genauso machbar. Aber gut ...

Grüße
rubberman
Member: ColdZero89
ColdZero89 Jul 13, 2012 at 09:10:24 (UTC)
Goto Top
Moinsen,

ja am Ende habe ich mehrere Scripte, das stimmt wohl, die Vergammeln dann aber in %temp% und jucken mich somit nicht.

Da nicht nur ich mit der Datei dann Arbeite, aber ich alleine das Wissen habe (Mit und Ohne Hilfe) das Umzusetzen, möchte ich kein Risiko eingehen, dass das Ganze irgendwann sonstwo rumliegt und es nur Probleme gibt.

Ja kann ich mir denken, dass das in VBS möglich ist, dennoch kenne ich mich mit Batch bedeutend besser aus.

Ich will halt Fehler 30 so gut es geht NICHT haben, daher alles in EIN Script.

Grüßle Zero
Mitglied: 76109
76109 Jul 17, 2012 updated at 09:02:23 (UTC)
Goto Top
Hallo zusammen!

Nachdem ich nun das Ganze nochmal getestet habe, insbsondere mit mehreren Dateien (*.csv, *.txt, *.ods), musste ich leider feststellen, dass das OO-Fenster doch ziemlich nervt. Dank rubbermans hervorragender Vorarbeit, habe ich nun ein Skript gebastelt, mit dem der Vorgang völlig im Hintergrund stattfindet.

Ausserdem habe ich im Sinne der besseren Performance, dass Skript so gestaltet, dass beim Konvertieren mehrerer Dateien, der OpenOffice-Prozess nur einmal zu Begin geladen und erst am Ende terminiert wird.

Hier der Vollständigkeit halber, die neue Version:
'Aufrufbeispiel über Batch mit den Dateitypen [*.csv, *.txt, *.ods]:  
'@cscript //nologo "E:\Test\ConvertToXls.vbs" "E:\Test\*.csv"  

'Aufrufbeispiel direkt mit den Dateitypen [*.csv, *.txt, *.ods]:  
'E:\Test\ConvertToXls.vbs "E:\Test\*.csv"  


Option Explicit

Const CsvChar = "ANSI"      'Zeichensatz  
Const CsvText = """"        'Text-Trennzeichen = (")  
Const CsvDelim = ";"        'Trennzeichen = (;)  
Const CsvStart = 1          'Startzeile  
    
Const ErrMsg1 = "Falsche Anzahl an Argumenten!"  
Const ErrMsg2 = "Falscher Dateityp [*.csv, *.txt, *.ods]"  
Const ErrMsg3 = "Quell-Datei nicht gefunden!"  
Const ErrMsg4 = "OpenOffice konnte nicht geladen werden!"  

'Konstanten zum ermitteln des Pfades der OpenOffice-Start-Exe  
Const iHKCU = &H80000001
Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"  
Const sRegValue = "Path"  
    
'Konstanten zum Laden des OpenOffice-Prozesses im Hintergrund  
Const sWinMan = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"  
Const sWinReg = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"  
Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin' And ParentProcessID="  
Const SW_HIDE = 0


Dim oOODesktop, aOOArgs(2), oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile

 
'Main Beg  

    Set oArgs = WScript.Arguments
    
    If oArgs.Count <> 1 Then
        WScript.Echo ErrMsg1:  WScript.Quit 1
    End If
        
    sSrcFile = oArgs(0)
    
    Set oFso = CreateObject("Scripting.FileSystemObject")  
        
    sExtName = LCase(oFso.GetExtensionName(sSrcFile))
    
    Select Case sExtName
        Case "csv", "txt", "ods"  
        Case Else: WScript.Echo ErrMsg2:   WScript.Quit 1
    End Select
        
    sBaseName = oFso.GetBaseName(sSrcFile)
    sFolder = oFso.GetParentFolderName(sSrcFile)
    
    If sBaseName = "*" Then  
        Call OpenOfficeStartup
        For Each oFile In oFso.GetFolder(sFolder).Files
            If LCase(oFso.GetExtensionName(oFile)) = sExtName Then
                sBaseName = oFso.GetBaseName(oFile)
                sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")  
                Call ConvertToXls(oFile.Path, sDstFile)
            End If
        Next
        Call OpenOfficeTerminate
    ElseIf Not oFso.FileExists(sSrcFile) Then
        WScript.Echo ErrMsg3:   WScript.Quit 1
    Else
        sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")  
        Call OpenOfficeStartup
        Call ConvertToXls(sSrcFile, sDstFile)
        Call OpenOfficeTerminate
    End If

    Set oFso = Nothing

    WScript.Echo "Fertig!":   WScript.Quit 0  

'Main End  


Private Sub ConvertToXls(ByRef sCsvFile, sXlsFile)
    Dim iCsvDelim, iCsvText, iFilter
    
    Select Case LCase(Right(sCsvFile, 3))
        Case "csv", "txt"  
            iFilter = True
        Case "ods"  
            iFilter = False
        Case Else
            Exit Sub
    End Select
    
    aOOArgs(0).Name = "Hidden"  
    aOOArgs(0).Value = True
    aOOArgs(1).Name = "FilterName"  
    aOOArgs(1).Value = ""  
    aOOArgs(2).Name = "FilterOptions"  
    aOOArgs(2).Value = ""  
        
    iCsvDelim = Asc(CsvDelim):  iCsvText = Asc(CsvText)
    
    If iFilter Then     'Argumente nur für *.csv und *.txt  
        aOOArgs(1).Value = "Text - txt - csv (StarCalc)"  
        aOOArgs(2).Value = Join(Array(iCsvDelim, iCsvText, CsvChar, CsvStart), ",")  
    End If
    
    With oOODesktop.LoadComponentFromURL(GetURL(sCsvFile), "_blank", 0, aOOArgs)  
        aOOArgs(1).Value = "MS Excel 97"  
        aOOArgs(2).Value = ""  
       .storeAsURL GetURL(sXlsFile), aOOArgs
       .Close False
    End With
End Sub

Private Sub OpenOfficeStartup()
    Dim i
    
    Call LoadOpenOfficeProcess
    
    With CreateObject("com.sun.star.ServiceManager")  
        For i = 0 To UBound(aOOArgs)
          Set aOOArgs(i) = .Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
        Next
        
        Set oOODesktop = .createInstance("com.sun.star.frame.Desktop")  
    End With
End Sub

Private Sub LoadOpenOfficeProcess()
    Dim oConfig, aRegValues, sExeFile, sExeFolder, iPID
    
    'Den Pfad der OpenOffice-Soffice.Exe in der Registry ermitteln  
    With GetObject(sWinReg)
       .EnumKey iHKCU, sRegKey, aRegValues
            
        If IsArray(aRegValues) Then
            If IsNumeric(aRegValues(0)) Then
                .GetStringValue iHKCU, sRegKey & aRegValues(0), sRegValue, sExeFile
            End If
        End If
    End With
    
    'OpenOffice-Programm-Verzeichnis ermitteln  
    sExeFolder = oFso.GetParentFolderName(sExeFile)
    
    If sExeFolder = "" Then WScript.Echo ErrMsg4:  WScript.Quit 1  

    'OpenOffice ohne GUI versteckt öffnen und warten bis der Prozess vollständig geladen ist  
    With GetObject(sWinMan)
        Set oConfig = .Get("Win32_ProcessStartup").SpawnInstance_:  oConfig.ShowWindow = SW_HIDE  
    
        If .Get("Win32_Process").Create(sExeFile & " -invisible", sExeFolder, oConfig, iPID) Then   
            WScript.Echo ErrMsg4:  WScript.Quit 1
        End if
    
        Do Until .ExecQuery(sBinSql & iPID).Count:  Loop
    End With
End Sub

Private Sub OpenOfficeTerminate()
    Dim i
    
    oOODesktop.Terminate:   Set oOODesktop = Nothing
    
    For i = 0 To UBound(aOOArgs)
        Set aOOArgs(i) = Nothing
    Next
End Sub

Rem Absolute/Relative Pfade ins OO-URL-Format konvertieren
Private Function GetURL(ByRef sFilename)
    Dim sChars, sClient, i
    
    If Left(sFilename, 2) = "\\" Then sClient = "File:" Else sClient = "File:///"  
    
    sChars = Array("\", "/", "%", "%25", " ", "%20")  
    
    GetURL = sClient & oFso.GetAbsolutePathName(sFilename)
    
    For i = 0 To UBound(sChars) Step 2
        GetURL = Replace(GetURL, sChars(i), sChars(i + 1))
    Next
End Function

Gruß Dieter
Member: rubberman
rubberman Jul 17, 2012 at 19:01:16 (UTC)
Goto Top
Hallo Dieter,

super! Da hast du noch einiges an Funktionalität und Feinarbeit hinein gesteckt.

Ein Problem habe ich noch immer und ich weiß nicht, ob das nur auf meiner Kiste so ist:
Ich hatte oben ein Sleep von 2 Sekunden eingebaut. Selbst wenn soffice.bin bereits detektiert wird, heißt das irgendwie nicht, dass nicht doch noch eine 2. Instanz erzeugt wird und der OO Desktop trotzdem sichtbar wird. Nach diesen 2 Sekunden passiert das nicht mehr. Hast du eine Erklärung? Ich denke, dass entweder der Prozess noch nicht vollständig geladen ist, oder es einfach eine gewisse Zeit braucht, bis der Prozess im gesamten OS bekannt ist. Ich habe diesen Effekt schon mehrfach in anderen Scripts beobachtet, aber nie eine Möglichkeit gefunden ausfindig zu machen, wann es gefahrlos weiter gehen kann. Diese 2 Sekunden sind nur ein Erfahrungswert.

Übrigens sind wir quitt. Nachdem mein Script bei dir nicht auf Anhieb gelaufen ist, gilt das nun umgekehrt auch (Stichwort HKCU/HKLM) face-wink

Grüße
rubberman
Mitglied: 76109
76109 Jul 17, 2012 at 20:30:36 (UTC)
Goto Top
Hallo rubberman!

Übrigens sind wir quitt. Nachdem mein Script bei dir nicht auf Anhieb gelaufen ist,
gilt das nun umgekehrt auch (Stichwort HKCU/HKLM)
Freut mich zu hörenface-wink

Also, ich habe jetzt mal folgendes getestet (im XP-Mode):
Erst den OO-Desktop geöffnet und dann das Script gestartet (30 Dateien), mit dem Ergebnis:
Es wird keine weitere Instanz von OO geladen und der zuvor manuell geöffnete Desktop wird terminiert (Calc nicht sichtbar).

Erst Script gestartet und dann versucht den Desktop zu öffnen, mit dem Ergebnis:
Es läßt sich in der Zeit, in der das Script läuft, keine weitere Instanz des Desktops zusätzlich öffnen.

Und das Ganze mit 2 Sekunden Pause, genau der gleiche Effektface-wink

Falls Calc bereits zuvor geöffnet ist, dann ebenfalls der gleiche Ablauf, wobei im Falle von Änderungen in der Calc-Datei eine entsprechende Meldung (speichern, verwerfen, abbrechen) angezeigt wird. Ansonsten, wird der zuvor gestartete Calc-Prozess ebenfalls gleich mit terminiert.

Am besten wird sein, vor dem Start des Scripts zu prüfen ob OO gerade aktiv ist und wenn ja, dann das Script mit einer entsprechenden Meldung abbrechen.


Gruß Dieter
Member: rubberman
rubberman Jul 17, 2012, updated at Jul 18, 2012 at 16:05:48 (UTC)
Goto Top
Hallo Dieter!

Sorry, wenn ich mich nicht richtig ausgedrückt habe. Natürlich gibt es immer nur eine Instanz. Auf dieser Basis arbeiten wir ja wenn wir OOo im Vorfeld versteckt öffnen.
Ich weiß nicht wie ich es besser erklären kann, als wenn CreateObject("com.sun.star.ServiceManager") schneller ankommt, als die zuvor erzeugte Instanz bekannt ist, dann kommt das GUI trotzdem.

Wie auch immer, ich war in der Lage dieses Problem zu umschiffen. Es scheint, als würde das entsprechende InstanceCreationEvent genau um die richtige Zeitspanne später kommen. Siehe Zeilen 33, 155, 161 - 166.
Ich habe mal versucht dein Script entsprechend zu adaptieren.
'Aufrufbeispiel über Batch mit den Dateitypen [*.csv, *.txt, *.ods]:  
'@cscript //nologo "E:\Test\ConvertToXls.vbs" "E:\Test\*.csv"  

'Aufrufbeispiel direkt mit den Dateitypen [*.csv, *.txt, *.ods]:  
'E:\Test\ConvertToXls.vbs "E:\Test\*.csv"  


Option Explicit

Const CsvChar = "ANSI"      'Zeichensatz  
Const CsvText = """"        'Text-Trennzeichen = (")  
Const CsvDelim = ";"        'Trennzeichen = (;)  
Const CsvStart = 1          'Startzeile  

Const ErrMsg0 = "Abbruch: Die OpenOffice-Anwendung bitte vorher Schließen!"  
Const ErrMsg1 = "Falsche Anzahl an Argumenten!"  
Const ErrMsg2 = "Falscher Dateityp [*.csv, *.txt, *.ods]"  
Const ErrMsg3 = "Quell-Datei nicht gefunden!"  
Const ErrMsg4 = "OpenOffice konnte nicht geladen werden!"  

'Konstante zum Check, ob OpenOffice bereits läuft  
Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin'"  

'Konstanten zum ermitteln des Pfades der OpenOffice-Start-Exe  
Const iHKCU = &H80000001
Const iHKLM = &H80000002
Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"  
Const sRegValue = "Path"  

'Konstanten zum Laden des OpenOffice-Prozesses im Hintergrund  
Const sWinMan = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"  
Const sWinReg = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"  
Const sEvtSql = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"  
Const SW_HIDE = 0


Dim oOODesktop, aOOArgs(2), oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile


'Main Beg  

    If GetObject(sWinMan).ExecQuery(sBinSql).Count Then
        WScript.Echo ErrMsg0:  WScript.Quit 1
    End If

    Set oArgs = WScript.Arguments

    If oArgs.Count <> 1 Then
        WScript.Echo ErrMsg1:  WScript.Quit 1
    End If

    sSrcFile = oArgs(0)

    Set oFso = CreateObject("Scripting.FileSystemObject")  

    sExtName = LCase(oFso.GetExtensionName(sSrcFile))

    Select Case sExtName
        Case "csv", "txt", "ods"  
        Case Else: WScript.Echo ErrMsg2:   WScript.Quit 1
    End Select

    sBaseName = oFso.GetBaseName(sSrcFile)
    sFolder = oFso.GetParentFolderName(sSrcFile)

    If sBaseName = "*" Then  
        Call OpenOfficeStartup
        For Each oFile In oFso.GetFolder(sFolder).Files
            If LCase(oFso.GetExtensionName(oFile)) = sExtName Then
                sBaseName = oFso.GetBaseName(oFile)
                sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")  
                Call ConvertToXls(oFile.Path, sDstFile)
            End If
        Next
        Call OpenOfficeTerminate
    ElseIf Not oFso.FileExists(sSrcFile) Then
        WScript.Echo ErrMsg3:   WScript.Quit 1
    Else
        sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")  
        Call OpenOfficeStartup
        Call ConvertToXls(sSrcFile, sDstFile)
        Call OpenOfficeTerminate
    End If

    Set oFso = Nothing

    WScript.Echo "Fertig!":   WScript.Quit 0  

'Main End  


Private Sub ConvertToXls(ByRef sCsvFile, sXlsFile)
    Dim iCsvDelim, iCsvText, iFilter

    Select Case LCase(Right(sCsvFile, 3))
        Case "csv", "txt"  
            iFilter = True
        Case "ods"  
            iFilter = False
        Case Else
            Exit Sub
    End Select

    aOOArgs(0).Name = "Hidden"  
    aOOArgs(0).Value = True
    aOOArgs(1).Name = "FilterName"  
    aOOArgs(1).Value = ""  
    aOOArgs(2).Name = "FilterOptions"  
    aOOArgs(2).Value = ""  

    iCsvDelim = Asc(CsvDelim):  iCsvText = Asc(CsvText)

    If iFilter Then     'Argumente nur für *.csv und *.txt  
        aOOArgs(1).Value = "Text - txt - csv (StarCalc)"  
        aOOArgs(2).Value = Join(Array(iCsvDelim, iCsvText, CsvChar, CsvStart), ",")  
    End If

    With oOODesktop.LoadComponentFromURL(GetURL(sCsvFile), "_blank", 0, aOOArgs)  
        aOOArgs(1).Value = "MS Excel 97"  
        aOOArgs(2).Value = ""  
       .storeAsURL GetURL(sXlsFile), aOOArgs
       .Close False
    End With
End Sub

Private Sub OpenOfficeStartup()
    Dim i

    Call LoadOpenOfficeProcess

    With CreateObject("com.sun.star.ServiceManager")  
        For i = 0 To UBound(aOOArgs)
          Set aOOArgs(i) = .Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
        Next

        Set oOODesktop = .createInstance("com.sun.star.frame.Desktop")  
    End With
End Sub

Private Sub LoadOpenOfficeProcess()
    Dim oConfig, oEventSrc, oEvent, sExeFile, sExeFolder, iPID

    'Den Pfad der OpenOffice-Soffice.Exe in der Registry ermitteln  
    sExeFile = GetSofficeExePath(iHKCU)
    If IsEmpty(sExeFile) Then sExeFile = GetSofficeExePath(iHKLM)

    'OpenOffice-Programm-Verzeichnis ermitteln  
    sExeFolder = oFso.GetParentFolderName(sExeFile)

    If sExeFolder = "" Then WScript.Echo ErrMsg4:  WScript.Quit 1  

    'OpenOffice ohne GUI versteckt öffnen und warten bis der Prozess vollständig geladen ist  
    With GetObject(sWinMan)
        Set oConfig = .Get("Win32_ProcessStartup").SpawnInstance_:  oConfig.ShowWindow = SW_HIDE  
        Set oEventSrc = .ExecNotificationQuery(sEvtSql)

        If .Get("Win32_Process").Create(sExeFile & " -invisible", sExeFolder, oConfig, iPID) Then  
            WScript.Echo ErrMsg4:  WScript.Quit 1
        End if

        Do
            Set oEvent = oEventSrc.NextEvent()
            If oEvent.TargetInstance.Name = "soffice.bin" And oEvent.TargetInstance.ParentProcessID = iPID Then  
                Exit Do
            End If
        Loop
    End With
End Sub

Private Sub OpenOfficeTerminate()
    Dim i

    oOODesktop.Terminate:   Set oOODesktop = Nothing

    For i = 0 To UBound(aOOArgs)
        Set aOOArgs(i) = Nothing
    Next
End Sub

Rem Absolute/Relative Pfade ins OO-URL-Format konvertieren
Private Function GetURL(ByRef sFilename)
    Dim sChars, sClient, i

    If Left(sFilename, 2) = "\\" Then sClient = "File:" Else sClient = "File:///"  

    sChars = Array("\", "/", "%", "%25", " ", "%20")  

    GetURL = sClient & oFso.GetAbsolutePathName(sFilename)

    For i = 0 To UBound(sChars) Step 2
        GetURL = Replace(GetURL, sChars(i), sChars(i + 1))
    Next
End Function

Private Function GetSofficeExePath(iHKey)
    Dim aRegValues, sExePath

    With GetObject(sWinReg)
       .EnumKey iHKey, sRegKey, aRegValues

        If IsArray(aRegValues) Then
            If IsNumeric(aRegValues(0)) Then
                .GetStringValue iHKey, sRegKey & aRegValues(0), sRegValue, sExePath
            End If
        End If
    End With

    GetSofficeExePath = sExePath
End Function
[EDIT]Dieters Test auf bereits laufenden OOo Prozess eingefügt.[/EDIT]

Grüße
rubberman
Mitglied: 76109
76109 Jul 18, 2012 updated at 07:14:46 (UTC)
Goto Top
Hallo rubberman!

Ich weiß nicht wie ich es besser erklären kann, als wenn CreateObject("com.sun.star.ServiceManager") schneller ankommt, als die zuvor erzeugte Instanz bekannt ist, dann kommt das GUI trotzdem.
Jetzt hab ich's verstanden! Bei mir ist dieser Effekt allerdings nicht aufgetretenface-wink

Und danke, dass Du mein Skript entsprechend angepasst (adaptiert) hastface-wink

Gruß Dieter
Mitglied: 76109
76109 Jul 18, 2012 updated at 10:36:48 (UTC)
Goto Top
Hallo rubberman!

Bei der neuen Methode gibt es leider ein kleines Problemface-sad

Wenn die OpenOffice-Anwendung bereits geöffnet ist, dann bleibt das Skript hängen.

Abhilfe schafft eine entsprechende Abfrage am Skriptanfang:

Diese Konstanten noch hinzufügen:
Const ErrMsg0 = "Abbruch: Die OpenOffice-Anwendung bitte vorher Schließen!"  
Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin'"  
Und diese Codezeilen am Anfang einfügen:
If GetObject(sWinMan).ExecQuery(sBinSql).Count Then
    WScript.Echo ErrMsg0:  WScript.Quit 1
End If

Das wäre so oder so sinnvoll und der Einfachheit halber schlage ich vor, dass Du dein Skript entsprechend editierstface-wink


Gruß Dieter
Member: rubberman
rubberman Jul 18, 2012 at 15:59:27 (UTC)
Goto Top
Hallo Dieter!

Ja, das war mir ungetestet schon ziemlich klar. Natürlich hast du recht, dass man solche Komplettlösungen dann auch möglichst foolproof machen sollte. Ich baue die Abfrage oben ein. Danke für die Zuarbeit!

(BTW: Irgendwo unterwegs haben wir ColdZero89 wohl verloren. face-sad)

Grüße
rubberman
Mitglied: 76109
76109 Jul 18, 2012 at 16:14:25 (UTC)
Goto Top
Hallo rubberman!

(BTW: Irgendwo unterwegs haben wir ColdZero89 wohl verloren. )
Das hat mich auch schon gewundert, dass von ihm noch keine Rückmeldung gekommen ist? face-sad

Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 08:46:24 (UTC)
Goto Top
Moin,

ihr habt mich nicht verloren, ne Grippe hat mich flach gelegt trifft es besser.

Ich lese hier nur und denke WTF welches Script ist denn nun für mich das richtige? face-big-smile

Ich bin verwirrt und nicht ganz aufm Damm - erklären wohl die Schmerzmittel - daher schaltet mein Hirn auch net so schnell mit face-big-smile

Dennoch frage ich mich: Welches Script ist denn nun für mich das richtige? Ich meine das fing mal Kurz an und endete Lang x)

Gruß Zero
Mitglied: 76109
76109 Jul 19, 2012 updated at 09:02:28 (UTC)
Goto Top
Hallo ColdZero89!

ihr habt mich nicht verloren, ne Grippe hat mich flach gelegt trifft es besser.
Na, dann gute Besserungface-wink

Dennoch frage ich mich: Welches Script ist denn nun für mich das richtige? Ich meine das fing mal Kurz an und endete Lang x)
Nun, dass Skript das ich Dir zum Testen angeboten hatte, war schonmal eine Erstlösung und die andere Variante war, wie Du sicherlich selbst erkennen konntest, noch nicht ganz ausgereift und getestetface-wink

Demzufolge würde ich an Deiner Stelle jetzt das letzte Skript von ruberman verwenden. Das nun ein richtig professionelles und sehr gutes Skript istface-wink

Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 19, 2012 updated at 09:24:58 (UTC)
Goto Top
Moin,

Danke.

Eigentlich wollte ich nur CSV zu XLS, dass das so kompliziert wird, konnte ich ja nicht ahnen face-big-smile

Ich teste grad mal. Geb gleich Rückmeldung.

Gruß Zero
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 09:28:11 (UTC)
Goto Top
Moinsen,

er gibt mir Meldung: Abbruch: Die OpenOffice-Anwendung bitte vorher Schließen!

Ich hab kein OO offen face-big-smile im TM läuft kein Prozess von OO.

*Kopfkratz* was läuft da krum? face-big-smile

Btw: Sehe ich das richtig, dass das VBS die CSV Datei selbstständig ermittelt - bzw die nimmt die im selben Ordner ist?

Dazu, es ist ein XP System - ich denke Zwar nicht, dass das nen unterschied im Script macht, aber ich glaube ich habe DIE Information nicht erwähnt.

Gruß Zero
Mitglied: 76109
76109 Jul 19, 2012 at 09:56:12 (UTC)
Goto Top
Hallo ColdZero89!

Bist Du sicher, dass im TM die soffice.exe und soffice.bin nicht als Prozess läuft? Ansonsten kann ich das absolut nicht nachvollziehen.face-wink

Ist in der Taskleiste das OO-Symbol sichtbar?

Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 10:01:21 (UTC)
Goto Top
Moin,

räusper.... soffice heißt der Prozess?! Die ganze Anwendnug heißt OPENOFFICE - dann sollte der Prozess ooffice oder so heißen face-big-smile und Dieter? Nun lächel nicht :-P

Nagut danke Problem 1 behoben, das kommt davon wenn man nicht mit OO mal arbeitet.....

Problem 2: Falsche Anzahl an Argumenten!

Grummel... würd ich da mehr durchsteigen würd ich kapieren was er mir sagen will. Aber so? Hilfeee face-big-smile

Als Info: VBS liegt im Ordner mit einer Bat und einer CSV Datei. Eventuell ist dies ja entscheidend.

Danke schonmal.

Gruß Zero
Mitglied: 76109
76109 Jul 19, 2012 updated at 10:20:00 (UTC)
Goto Top
Hallo ColdZero89!

Über Batch mit einem Argument aufrufen so:
@cscript //nologo "C:\Pfad\ConvertToXls.vbs" "C:\Pfad\*.csv"

oder von der Commandozeile dann so:
C:\Pfad\ConvertToXls.vbs "C:\Pfad\*.csv"


Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 11:16:11 (UTC)
Goto Top
Moin,

ah ok... heißt das Script ist darauf ausgelegt die genaue Dateiangabe zu bekommen.

Ok. Wird gleich getestet.

Danke Dieter und rubberman!

Geb gleich Meldung.

Gruß Zero
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 11:30:39 (UTC)
Goto Top
Moinsen face-big-smile

zu erst dachte ich grad: grml wieso schließt der die soffice.bin nicht schließt - tut er doch, keine Ahnung wieso die gerade bei mir offen geblieben ist, beim 2ten und 3ten Versuch gehte alles blitze Blank face-big-smile

Ich danke euch beiden Vielmals!

Nun nur noch das Makro anpassen das es keine XLSX will sondern eine XLS sich zum futtern vornimmt und meine Welt ist friedlich und gelassen face-big-smile

Ich makiere den Beitrag als gelöst, ihr könnt ja weiterhin eure Spielerrein über dieses Script ziehen lassen face-wink

Gruß Zero
Mitglied: 76109
76109 Jul 19, 2012 at 11:34:52 (UTC)
Goto Top
Hallo ColdZero89!

ah ok... heißt das Script ist darauf ausgelegt die genaue Dateiangabe zu bekommen.
Jainface-wink

Du kannst sowohl einen Dateinamen 'C:\pfad\xy.csv', als auch alle Csv's in einem ordner mit 'C:\pfad\*.csv' als Argument übergeben.

Ich makiere den Beitrag als gelöst, ihr könnt ja weiterhin eure Spielerrein über dieses Script ziehen lassen
Wir haben soweit ausgespieltface-wink


Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 19, 2012 updated at 12:08:05 (UTC)
Goto Top
Moin,

gut ich nicht.... *heul* ich sing gleich das Airameva rückwärts....

Nun wollte ich das ganze schön säuberlich in mein Batch einbasteln... FEHLANZEIGE... Problem: Ich bau selbst eine Pause ein, der springt mir VOR der Pause aber schon aus dem Script und zwar komplett.... habe die Pause stück für Stück nach vorne gesetzt... bringt nichts...

Ich tacker mein Script hier gleich mal fein Säuberlich ein - habe nichts anderes gemacht als sonst vorher überall auch...... wo is mein Fehler?

@echo off & setlocal

rem Changelog
rem 1.0 Batch/VB-Skript zur Versendung von exportierte Anlagendaten per E-Mail mithilfe eines Auswahlmenüs
rem 2.0 Umwandlung der exportierten CSV Datei in XLS (Script von rubberman und didi1954)
rem V2.0 Kevin Lange 19.07.2012

rem ====================================================================
rem Deklarierung
rem ====================================================================
	set "Ein=C:\Datenversand\InverterOverview.csv"  
	set "Aus=C:\Datenversand\Thuengen Daten.csv"  
	set "Send=C:\Datenversand\Thuengen Daten.xls"  
	set "Mail=E-Mail@E-Mail"  

rem ====================================================================
rem E-Mail Adresse auswählen
rem ====================================================================
	echo [1] Mailziel1


	set /p Mailnr=Bitte Nummer vom Empaenger eingeben: 

	GOTO CASE_%Mailnr%
		:CASE_1
			set "Mail=MAILZIEL1@mailempfang.de"  
				GOTO END_SWITCH

		HIER SIND MEHRERE MAILADRESSEN VORHANDEN

		:END_SWITCH

rem ====================================================================
rem Datei umbenennen
rem ====================================================================
	move "%Ein%" "%Aus%"  

rem ====================================================================
rem Erstellung des VBS zum Umwandeln
rem ====================================================================

rem Aufrufbeispiel über Batch mit den Dateitypen [*.csv, *.txt, *.ods]:
rem @cscript //nologo "E:\Test\ConvertToXls.vbs" "E:\Test\*.csv"   

rem Aufrufbeispiel direkt mit den Dateitypen [*.csv, *.txt, *.ods]:
rem E:\Test\ConvertToXls.vbs "E:\Test\*.csv"  

	Set "U=%temp%\CSVtoXLS.vbs"  

	>"%U%" echo Option Explicit  

	>>"%U%" echo Const CsvChar = "ANSI"      'Zeichensatz  
	>>"%U%" echo Const CsvText = """"        'Text-Trennzeichen = (")  
	>>"%U%" echo Const CsvDelim = ";"        'Trennzeichen = (;)  
	>>"%U%" echo Const CsvStart = 1          'Startzeile  
	>>"%U%" echo Const ErrMsg0 = "Abbruch: Die OpenOffice-Anwendung bitte vorher Schließen!"  
	>>"%U%" echo Const ErrMsg1 = "Falsche Anzahl an Argumenten!"  
	>>"%U%" echo Const ErrMsg2 = "Falscher Dateityp [*.csv, *.txt, *.ods]"  
	>>"%U%" echo Const ErrMsg3 = "Quell-Datei nicht gefunden!"  
	>>"%U%" echo Const ErrMsg4 = "OpenOffice konnte nicht geladen werden!"  
	
	rem Konstante zum Check, ob OpenOffice bereits läuft
	>>"%U%" echo Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin'"  
	rem Konstanten zum ermitteln des Pfades der OpenOffice-Start-Exe
	>>"%U%" echo Const iHKCU = &H80000001  
	>>"%U%" echo Const iHKLM = &H80000002  
	>>"%U%" echo Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"  
	>>"%U%" echo Const sRegValue = "Path"  
	rem Konstanten zum Laden des OpenOffice-Prozesses im Hintergrund
	>>"%U%" echo Const sWinMan = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"  
	>>"%U%" echo Const sWinReg = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"  
	>>"%U%" echo Const sEvtSql = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"  
	>>"%U%" echo Const SW_HIDE = 0  
	>>"%U%" echo Dim oOODesktop, aOOArgs(2), oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile			  

	rem Main Beg
	>>"%U%" echo If GetObject(sWinMan).ExecQuery(sBinSql).Count Then  
	>>"%U%" echo WScript.Echo ErrMsg0:  WScript.Quit 1  
	>>"%U%" echo End If  
	>>"%U%" echo Set oArgs = WScript.Arguments   
	>>"%U%" echo If oArgs.Count <> 1 Then  
	>>"%U%" echo WScript.Echo ErrMsg1:  WScript.Quit 1  
	>>"%U%" echo End If  
	>>"%U%" echo sSrcFile = oArgs(0)	  
	>>"%U%" echo Set oFso = CreateObject("Scripting.FileSystemObject")  
	>>"%U%" echo sExtName = LCase(oFso.GetExtensionName(sSrcFile))  
	>>"%U%" echo Select Case sExtName  
	>>"%U%" echo Case "csv", "txt", "ods"  
	>>"%U%" echo Case Else: WScript.Echo ErrMsg2:   WScript.Quit 1  
         >>"%U%" echo End Select  
	>>"%U%" echo sBaseName = oFso.GetBaseName(sSrcFile)  
	>>"%U%" echo sFolder = oFso.GetParentFolderName(sSrcFile)  
	>>"%U%" echo If sBaseName = "*" Then  
	>>"%U%" echo Call OpenOfficeStartup  
	>>"%U%" echo For Each oFile In oFso.GetFolder(sFolder).Files  
	>>"%U%" echo If LCase(oFso.GetExtensionName(oFile)) = sExtName Then  
	>>"%U%" echo sBaseName = oFso.GetBaseName(oFile)  
	>>"%U%" echo sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")  
	>>"%U%" echo Call ConvertToXls(oFile.Path, sDstFile)  
	>>"%U%" echo End If  
	>>"%U%" echo Next  
	>>"%U%" echo Call OpenOfficeTerminate  
	>>"%U%" echo ElseIf Not oFso.FileExists(sSrcFile) Then  
	>>"%U%" echo WScript.Echo ErrMsg3:   WScript.Quit 1  
	>>"%U%" echo Else  
	>>"%U%" echo sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")  
	>>"%U%" echo Call OpenOfficeStartup  
	>>"%U%" echo Call ConvertToXls(sSrcFile, sDstFile)  
	>>"%U%" echo Call OpenOfficeTerminate  
	>>"%U%" echo End If  
	>>"%U%" echo Set oFso = Nothing  
	>>"%U%" echo WScript.Echo "Fertig!":   WScript.Quit 0  
	rem Main End

	>>"%U%" echo Private Sub ConvertToXls(ByRef sCsvFile, sXlsFile)  
	>>"%U%" echo Dim iCsvDelim, iCsvText, iFilter   
	>>"%U%" echo Select Case LCase(Right(sCsvFile, 3))  
	>>"%U%" echo Case "csv", "txt"  
	>>"%U%" echo iFilter = True  
	>>"%U%" echo Case "ods"  
	>>"%U%" echo iFilter = False	  
	>>"%U%" echo Case Else  
	>>"%U%" echo Exit Sub  
	>>"%U%" echo End Select  
	>>"%U%" echo aOOArgs(0).Name = "Hidden"  
	>>"%U%" echo aOOArgs(0).Value = True  
	>>"%U%" echo aOOArgs(1).Name = "FilterName"  
	>>"%U%" echo aOOArgs(1).Value = ""  
	>>"%U%" echo aOOArgs(2).Name = "FilterOptions"  
	>>"%U%" echo aOOArgs(2).Value = ""   
	>>"%U%" echo iCsvDelim = Asc(CsvDelim):  iCsvText = Asc(CsvText)  
	>>"%U%" echo If iFilter Then     'Argumente nur für *.csv und *.txt  
	>>"%U%" echo aOOArgs(1).Value = "Text - txt - csv (StarCalc)"  
	>>"%U%" echo aOOArgs(2).Value = Join(Array(iCsvDelim, iCsvText, CsvChar, CsvStart), ",")  
	>>"%U%" echo End If  
	>>"%U%" echo With oOODesktop.LoadComponentFromURL(GetURL(sCsvFile), "_blank", 0, aOOArgs)  
	>>"%U%" echo aOOArgs(1).Value = "MS Excel 97"  
	>>"%U%" echo aOOArgs(2).Value = ""  
	>>"%U%" echo .storeAsURL GetURL(sXlsFile), aOOArgs  
	>>"%U%" echo .Close False  
	>>"%U%" echo End With  
	>>"%U%" echo End Sub  

	>>"%U%" echo Private Sub OpenOfficeStartup()  
	>>"%U%" echo Dim i  
	>>"%U%" echo Call LoadOpenOfficeProcess  
	>>"%U%" echo With CreateObject("com.sun.star.ServiceManager")  
	>>"%U%" echo For i = 0 To UBound(aOOArgs)  
	>>"%U%" echo Set aOOArgs(i) = .Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
	>>"%U%" echo Next  
	>>"%U%" echo Set oOODesktop = .createInstance("com.sun.star.frame.Desktop")  
	>>"%U%" echo End With  
	>>"%U%" echo End Sub  

	>>"%U%" echo Private Sub LoadOpenOfficeProcess()  
	>>"%U%" echo Dim oConfig, oEventSrc, oEvent, sExeFile, sExeFolder, iPID  
	rem Den Pfad der OpenOffice-Soffice.Exe in der Registry ermitteln
	>>"%U%" echo sExeFile = GetSofficeExePath(iHKCU)  
	>>"%U%" echo If IsEmpty(sExeFile) Then sExeFile = GetSofficeExePath(iHKLM)  
	rem OpenOffice-Programm-Verzeichnis ermitteln
	>>"%U%" echo sExeFolder = oFso.GetParentFolderName(sExeFile)  
	>>"%U%" echo If sExeFolder = "" Then WScript.Echo ErrMsg4:  WScript.Quit 1  
	rem OpenOffice ohne GUI versteckt öffnen und warten bis der Prozess vollständig geladen ist
	>>"%U%" echo With GetObject(sWinMan)  
	>>"%U%" echo Set oConfig = .Get("Win32_ProcessStartup").SpawnInstance_:  oConfig.ShowWindow = SW_HIDE  
	>>"%U%" echo Set oEventSrc = .ExecNotificationQuery(sEvtSql)  
	>>"%U%" echo If .Get("Win32_Process").Create(sExeFile & " -invisible", sExeFolder, oConfig, iPID) Then  
	>>"%U%" echo WScript.Echo ErrMsg4:  WScript.Quit 1  
	>>"%U%" echo End if  
	>>"%U%" echo Do  
	>>"%U%" echo Set oEvent = oEventSrc.NextEvent()  
	>>"%U%" echo If oEvent.TargetInstance.Name = "soffice.bin" And oEvent.TargetInstance.ParentProcessID = iPID Then  
	>>"%U%" echo Exit Do  
	>>"%U%" echo End If  
	>>"%U%" echo Loop  
	>>"%U%" echo End With  
	>>"%U%" echo End Sub  

	>>"%U%" echo Private Sub OpenOfficeTerminate()  
	>>"%U%" echo Dim i  
	>>"%U%" echo oOODesktop.Terminate:   Set oOODesktop = Nothing  
	>>"%U%" echo For i = 0 To UBound(aOOArgs)  
	>>"%U%" echo Set aOOArgs(i) = Nothing  
	>>"%U%" echo Next  
	>>"%U%" echo End Sub  

Rem Absolute/Relative Pfade ins OO-URL-Format konvertieren

	>>"%U%" echo Private Function GetURL(ByRef sFilename)  
	>>"%U%" echo Dim sChars, sClient, i  
	>>"%U%" echo If Left(sFilename, 2) = "\\" Then sClient = "File:" Else sClient = "File:///"  
	>>"%U%" echo sChars = Array("\", "/", "%", "%25", " ", "%20")  
	>>"%U%" echo GetURL = sClient & oFso.GetAbsolutePathName(sFilename)  
	>>"%U%" echo For i = 0 To UBound(sChars) Step 2  
	>>"%U%" echo GetURL = Replace(GetURL, sChars(i), sChars(i + 1))  
	>>"%U%" echo Next  
	>>"%U%" echo End Function  

	>>"%U%" echo Private Function GetSofficeExePath(iHKey)  
	>>"%U%" echo Dim aRegValues, sExePath  
	>>"%U%" echo With GetObject(sWinReg)  
	>>"%U%" echo .EnumKey iHKey, sRegKey, aRegValues  
	>>"%U%" echo If IsArray(aRegValues) Then  
	>>"%U%" echo If IsNumeric(aRegValues(0)) Then  
	>>"%U%" echo .GetStringValue iHKey, sRegKey & aRegValues(0), sRegValue, sExePath  
	>>"%U%" echo End If  
	>>"%U%" echo End If  
	>>"%U%" echo End With  
	>>"%U%" echo GetSofficeExePath = sExePath  
	>>"%U%" echo End Function  
		
rem ====================================================================
rem CSV to XLS
rem ====================================================================
	echo ____________________________________	
	echo CSV-Datei wird in XLS umgewandelt. Bitte Warten...
	cscript //nologo "%U%" "%Send%"  

rem ====================================================================
rem Erstellung des VBS zum Mailversand
rem ====================================================================
	Set "M=%temp%\Mailversand.vbs"  
	>"%M%" echo Dim objMail,objConfig,objFields  
	>>"%M%" echo Set objMail = CreateObject("CDO.Message")  
	>>"%M%" echo Set objConfig = CreateObject("CDO.configuration")  
	>>"%M%" echo Set objFields = objConfig.Fields  
	>>"%M%" echo With objFields  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/SendUsing")= 2  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")= "mail.gmx.net"  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")= 1  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/SMTPServerPort")= 25  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "MAIL"  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "PW"  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true  
	>>"%M%" echo   .Update  
	>>"%M%" echo End With  
	>>"%M%" echo With objMail  
	>>"%M%" echo   Set .Configuration = objConfig  
	>>"%M%" echo   .To = "%Mail%"  
	>>"%M%" echo   .From = "MAIL"  
	>>"%M%" echo   .Subject = "Thuengen Daten"  
	>>"%M%" echo   .TextBody = "Thuengen Daten"  
	>>"%M%" echo   .AddAttachment "%Send%"  
	>>"%M%" echo   .Send  
	>>"%M%" echo End With  
	
	echo ____________________________________
	echo Ich versende nun die Dateien an %Mail%. Bitte Warten...
	cscript //nologo "%M%"  

	pause
	
rem ====================================================================
rem Versendete Anhänge löschen
rem ====================================================================
	del /Q "C:\Datenversand\Th*"  

Gruß Zero
Mitglied: 76109
76109 Jul 19, 2012 updated at 13:27:57 (UTC)
Goto Top
Hallo


Ich frage mich schon, warum Du das Skript über Batch erzeugst?

Destotrotz ist es kein Wunder, weil Du in dem dem Fall alle Batch-Steuerzeichen (&>|()...) entsprechend maskieren musst, damit Batch weiß, dass es diese Zeichen ignorieren sollface-wink

Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 13:30:49 (UTC)
Goto Top
Moin,

wieso maskieren? Bei dem Mailvbs funktioniert das auch wunderbar - wieso bei dem Script nicht?

*Grübel* ^_^

Gruß Zero
Mitglied: 76109
76109 Jul 19, 2012 updated at 14:01:34 (UTC)
Goto Top
Hallo Zero!

Schau Dir mal an, was in dem Script im Temp-Verzeichnis steht. Oder besser noch starte die Batch auf der Comandozeil mit echo Onface-wink

Nimm als beispiel dies '"%Mail%"' im Makro-Text. Da wird eine Variable aufgelöst. In unserem Skript muss aber alles 1:1 in das Skript geschrieben werden und nichts in irgendeiner weise durch Batch aufgelöst oder sonstig bearbeitet werdenface-wink

Gruß Dieter
Member: bastla
bastla Jul 19, 2012 updated at 14:14:00 (UTC)
Goto Top
Hallo Dieter!
Nimm als beispiel dies '"%Mail%"' im Makro-Text. Da wird eine Variable aufgelöst. In unserem Skript muss aber alles 1:1 in das Skript geschrieben werden und nichts in irgendeiner weise durch Batch aufgelöst oder sonstig bearbeitet werdenface-wink
Einspruch: Die Anführungszeichen sind dort, wo sie hingehören, und der Pfad dazwischen kommt (aufgelöst) aus der CMD-Variablen %Mail% - daher alles ok.

Was das Maskieren angeht: Betroffen sind (wegen der enthaltenen Zeichen "&", "<" und ">") ja nur die Zeilen 65, 66, 81, 98, 106, 167, 193 und 205 - also halb so wild ... face-wink

Grüße
bastla
Mitglied: 76109
76109 Jul 19, 2012 at 14:22:15 (UTC)
Goto Top
Hallo bastla!

Ok, das war jetze im Eifer des Gefechts etwas daneben gegriffenface-wink

Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 14:22:36 (UTC)
Goto Top
Moin,

redet ihr Deutsch mit mir? face-big-smile

Maskieren geht mit \ ?

Sind es nur die Zeichen die du nun genannt hast bastla oder gibt es noch mehr Zeichen die ich dann Maskieren muss?

Wieso heißt das eigentlich Maskieren? (meine Interpretation: Man setzt einem Zeichen damit eine Maske auf, damit das - in dem falle - Batch es nicht lesen will/kann/möchte. Richtig?)

Gruß Zero
Mitglied: 76109
76109 Jul 19, 2012 updated at 14:32:10 (UTC)
Goto Top
Hallo Zero!

Maskieren geht mit ^

Wieso heißt das eigentlich Maskieren? (meine Interpretation: Man setzt einem Zeichen damit eine Maske auf, damit das - in dem falle - Batch es nicht lesen will/kann/möchte. Richtig?)
Damit Batch es ignoriert und als normales Zeichen liestface-wink


Gruß Dieter
Member: bastla
bastla Jul 19, 2012 at 14:28:42 (UTC)
Goto Top
Damit Batch es ignoriert und als normales Zeichen liestface-wink
- man könnte auch sagen: Damit das Zeichen nicht interpretiert wird ... face-wink

Grüße
bastla
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 14:29:29 (UTC)
Goto Top
Moin,

danke.

War meine Interpretation ja gar nicht so falsch *g*

Gut werde ich dann - sofern ichs noch schaffe - heut noch umsetzen und testen.

Gruß Zero
Mitglied: 76109
76109 Jul 19, 2012 at 14:31:44 (UTC)
Goto Top
Hallo bastla!

- man könnte auch sagen: Damit das Zeichen nicht interpretiert wird ...
Jepp, hört sich zumindest besser anface-wink

Gruß Dieter
Member: ColdZero89
ColdZero89 Jul 19, 2012 at 14:33:49 (UTC)
Goto Top
Moin,

meine Bildliche Darstellung wie dem kleinem & zeichen Augen und ein Bart gemalt wird damit Batch denkt "mh schönes Zeichen aber nichts für mich" find ich irgendwie niedlicher face-wink face-big-smile

Gruß Zero
Member: bastla
bastla Jul 19, 2012 updated at 14:38:06 (UTC)
Goto Top
Hallo ColdZero89!
wie dem kleinem & zeichen Augen und ein Bart gemalt wird
Mach das nicht - damit erschreckst Du VBS face-big-smile (ein kleines lustiges Hütchen ist doch auch schon was face-wink) ...

Grüße
bastla
Member: ColdZero89
ColdZero89 Jul 19, 2012 updated at 15:17:34 (UTC)
Goto Top
Moin,

1. Platz ich gleich
2. Fress ich gleich nen Stock samt Brot dadran!
3. Hat wer Ketchup und Senf?

Nun bekomm ich den Fehler "Falscher Dateityp [*.csv, *.txt, *.ods]"


Fehler schon gefunden - die Stelle bei dem die VBS aufgerufen wird, dort hab ich die XLS mitgegeben anstatt die CSV...

Erneuter Test: Fehler.... Temp\CSVtoXLS.vbs(128, 1) Laufzeitfehler in Microsoft VBScript: Index außerhalb des gültigen Bereichs: '[number: 5]'

Hab gerade gemerkt es geht ja um die Zeilenangabe in VBS... das Erzeugte VBS steht nun hier, das Originalscript ist anch unten gewandert.

Option Explicit	
Const CsvChar = "ANSI"      'Zeichensatz	  
Const CsvText = """"        'Text-Trennzeichen = (")	  
Const CsvDelim = "	"        'Trennzeichen = (;)  
Const CsvStart = 1          'Startzeile  
Const ErrMsg0 = Abbruch: Die OpenOffice-Anwendung bitte vorher Schließen!"""  
Const ErrMsg1 = "Falsche Anzahl an Argumenten!"	  
Const ErrMsg2 = "Falscher Dateityp [*.csv, *.txt, *.ods]"	  
Const ErrMsg3 = "Quell-Datei nicht gefunden!"	  
Const ErrMsg4 = "OpenOffice konnte nicht geladen werden!"	  
Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin'"	  
Const iHKCU = &H80000001	
Const iHKLM = &H80000002	
Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"	  
Const sRegValue = "Path"	  
Const sWinMan = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"	  
Const sWinReg = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"	  
Const sEvtSql = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"	  
Const SW_HIDE = 0	
"Dim oOODesktop, aOOArgs(2), oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile			"	  
If GetObject(sWinMan).ExecQuery(sBinSql).Count Then	
WScript.Echo ErrMsg0:  WScript.Quit 1	
End If	
Set oArgs = WScript.Arguments 	
If oArgs.Count <> 1 Then	
WScript.Echo ErrMsg1:  WScript.Quit 1	
End If	
"sSrcFile = oArgs(0)	"	  
Set oFso = CreateObject("Scripting.FileSystemObject")	  
sExtName = LCase(oFso.GetExtensionName(sSrcFile))	
Select Case sExtName	
Case "csv", "txt", "ods"	  
Case Else: WScript.Echo ErrMsg2:   WScript.Quit 1	
End Select	
sBaseName = oFso.GetBaseName(sSrcFile)	
sFolder = oFso.GetParentFolderName(sSrcFile)	
If sBaseName = "*" Then	  
Call OpenOfficeStartup	
For Each oFile In oFso.GetFolder(sFolder).Files	
If LCase(oFso.GetExtensionName(oFile)) = sExtName Then	
sBaseName = oFso.GetBaseName(oFile)	
sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")	  
Call ConvertToXls(oFile.Path, sDstFile)	
End If	
Next	
Call OpenOfficeTerminate	
ElseIf Not oFso.FileExists(sSrcFile) Then	
WScript.Echo ErrMsg3:   WScript.Quit 1	
Else	
sDstFile = oFso.BuildPath(sFolder, sBaseName & ".xls")	  
Call OpenOfficeStartup	
Call ConvertToXls(sSrcFile, sDstFile)	
Call OpenOfficeTerminate	
End If	
Set oFso = Nothing	
WScript.Echo "Fertig!":   WScript.Quit 0	  
Private Sub ConvertToXls(ByRef sCsvFile, sXlsFile)	
Dim iCsvDelim, iCsvText, iFilter 	
Select Case LCase(Right(sCsvFile, 3))	
Case "csv", "txt"	  
iFilter = True	
Case "ods"	  
"iFilter = False	"	  
Case Else	
Exit Sub	
End Select	
aOOArgs(0).Name = "Hidden"	  
aOOArgs(0).Value = True	
aOOArgs(1).Name = "FilterName"	  
aOOArgs(1).Value = ""	  
aOOArgs(2).Name = "FilterOptions"	  
aOOArgs(2).Value = "" 	  
iCsvDelim = Asc(CsvDelim):  iCsvText = Asc(CsvText)	
If iFilter Then     'Argumente nur für *.csv und *.txt	  
aOOArgs(1).Value = "Text - txt - csv (StarCalc)"	  
aOOArgs(2).Value = Join(Array(iCsvDelim, iCsvText, CsvChar, CsvStart), ",")	  
End If	
With oOODesktop.LoadComponentFromURL(GetURL(sCsvFile), "_blank", 0, aOOArgs)	  
aOOArgs(1).Value = "MS Excel 97"	  
aOOArgs(2).Value = ""	  
.storeAsURL GetURL(sXlsFile), aOOArgs	
.Close False	
End With	
End Sub	
Private Sub OpenOfficeStartup()	
Dim i	
Call LoadOpenOfficeProcess	
With CreateObject("com.sun.star.ServiceManager")	  
For i = 0 To UBound(aOOArgs)	
Set aOOArgs(i) = .Bridge_GetStruct("com.sun.star.beans.PropertyValue")	  
Next	
Set oOODesktop = .createInstance("com.sun.star.frame.Desktop")	  
End With	
End Sub	
Private Sub LoadOpenOfficeProcess()	
Dim oConfig, oEventSrc, oEvent, sExeFile, sExeFolder, iPID	
sExeFile = GetSofficeExePath(iHKCU)	
If IsEmpty(sExeFile) Then sExeFile = GetSofficeExePath(iHKLM)	
sExeFolder = oFso.GetParentFolderName(sExeFile)	
If sExeFolder = "" Then WScript.Echo ErrMsg4:  WScript.Quit 1	  
With GetObject(sWinMan)	
Set oConfig = .Get("Win32_ProcessStartup").SpawnInstance_:  oConfig.ShowWindow = SW_HIDE	  
Set oEventSrc = .ExecNotificationQuery(sEvtSql)	
If .Get("Win32_Process").Create(sExeFile & " -invisible", sExeFolder, oConfig, iPID) Then	  
WScript.Echo ErrMsg4:  WScript.Quit 1	
End if	
Do	
Set oEvent = oEventSrc.NextEvent()	
If oEvent.TargetInstance.Name = "soffice.bin" And oEvent.TargetInstance.ParentProcessID = iPID Then	  
Exit Do	
End If	
Loop	
End With	
End Sub	
Private Sub OpenOfficeTerminate()	
Dim i	
oOODesktop.Terminate:   Set oOODesktop = Nothing	
For i = 0 To UBound(aOOArgs)	
Set aOOArgs(i) = Nothing	
Next	
End Sub	
Private Function GetURL(ByRef sFilename)	
Dim sChars, sClient, i	
If Left(sFilename, 2) = "\\" Then sClient = "File:" Else sClient = "File:///"	  
sChars = Array("\", "/", "25", " ", "0")	  
GetURL = sClient & oFso.GetAbsolutePathName(sFilename)	
For i = 0 To UBound(sChars) Step 2	
GetURL = Replace(GetURL, sChars(i), sChars(i + 1))	
Next	
End Function	
Private Function GetSofficeExePath(iHKey)	
Dim aRegValues, sExePath	
With GetObject(sWinReg)	
.EnumKey iHKey, sRegKey, aRegValues	
If IsArray(aRegValues) Then	
If IsNumeric(aRegValues(0)) Then	
.GetStringValue iHKey, sRegKey & aRegValues(0), sRegValue, sExePath	
End If	
End If	
End With	
GetSofficeExePath = sExePath	
End Function	

GRUMMEL!

Danke für eure Geduld.

Gruß Zero

P.S.: gibt es eigentlich sowas wie einen "spoiler"? Sodass man den Quellcode auf und zuklappen kann? In der Formatierungshilfe keinen gefunden... ^^

Originalscript
Nun nocheinmal das Script... Damit die Zeilenanghaben mit denen von mir übereinstimmen nun die ganzen mailadressen mal ersetzt...
@echo off & setlocal

rem Changelog
rem 1.0 Batch/VB-Skript zur Versendung von exportierte Anlagendaten per E-Mail mithilfe eines Auswahlmenüs
rem 2.0 Umwandlung der exportierten CSV Datei in XLS (Script von rubberman und didi1954)
rem V2.0b Kevin Lange 19.07.2012

rem ====================================================================
rem Deklarierung
rem ====================================================================
	set "Ein=C:\Datenversand\InverterOverview.csv"  
	set "Aus=C:\Datenversand\Thuengen Daten.csv"  
	set "Send=C:\Datenversand\Thuengen Daten.xls"  
	set "Mail=E-Mail@E-Mail"  

rem ====================================================================
rem E-Mail Adresse auswählen
rem ====================================================================
	echo [1] a
	echo [2] b
	echo [3] c
	echo [4] d
	echo [5] e
	echo [6] f
	echo [7] g
	echo [8] h
	echo [9] i
	echo [10] j

	set /p Mailnr=Bitte Nummer vom Empaenger eingeben: 

	GOTO CASE_%Mailnr%
		:CASE_1
			set "Mail=a"  
				GOTO END_SWITCH
		:CASE_2
			set "Mail=b"  
			GOTO END_SWITCH
		:CASE_3
			set "Mail=c"  
			GOTO END_SWITCH
		:CASE_4
			set "Mail=d"  
			GOTO END_SWITCH
		:CASE_5
			set "Mail=e"  
			GOTO END_SWITCH
		:CASE_6
			set "Mail=f"  
			GOTO END_SWITCH
		:CASE_7
			set "Mail=g"  
			GOTO END_SWITCH
		:CASE_8
			set "Mail=h"  
			GOTO END_SWITCH
		:CASE_9
			set "Mail=i"  
			GOTO END_SWITCH
		:CASE_10
			set "Mail=j"  
			GOTO END_SWITCH
		:END_SWITCH

rem ====================================================================
rem Datei umbenennen
rem ====================================================================
	move "%Ein%" "%Aus%"  

rem ====================================================================
rem Erstellung des VBS zum Umwandeln
rem ====================================================================

rem Aufrufbeispiel über Batch mit den Dateitypen [*.csv, *.txt, *.ods]:
rem @cscript //nologo "E:\Test\ConvertToXls.vbs" "E:\Test\*.csv"   

rem Aufrufbeispiel direkt mit den Dateitypen [*.csv, *.txt, *.ods]:
rem E:\Test\ConvertToXls.vbs "E:\Test\*.csv"  

	Set "U=%temp%\CSVtoXLS.vbs"  

	>"%U%" echo Option Explicit  

	>>"%U%" echo Const CsvChar = "ANSI"      'Zeichensatz  
	>>"%U%" echo Const CsvText = """"        'Text-Trennzeichen = (")  
	>>"%U%" echo Const CsvDelim = ";"        'Trennzeichen = (;)  
	>>"%U%" echo Const CsvStart = 1          'Startzeile  
	>>"%U%" echo Const ErrMsg0 = "Abbruch: Die OpenOffice-Anwendung bitte vorher Schließen!"  
	>>"%U%" echo Const ErrMsg1 = "Falsche Anzahl an Argumenten!"  
	>>"%U%" echo Const ErrMsg2 = "Falscher Dateityp [*.csv, *.txt, *.ods]"  
	>>"%U%" echo Const ErrMsg3 = "Quell-Datei nicht gefunden!"  
	>>"%U%" echo Const ErrMsg4 = "OpenOffice konnte nicht geladen werden!"  
	
	rem Konstante zum Check, ob OpenOffice bereits läuft
	>>"%U%" echo Const sBinSql = "Select * from Win32_Process Where Name='soffice.bin'"  
	rem Konstanten zum ermitteln des Pfades der OpenOffice-Start-Exe
	>>"%U%" echo Const iHKCU = ^&H80000001  
	>>"%U%" echo Const iHKLM = ^&H80000002  
	>>"%U%" echo Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"  
	>>"%U%" echo Const sRegValue = "Path"  
	rem Konstanten zum Laden des OpenOffice-Prozesses im Hintergrund
	>>"%U%" echo Const sWinMan = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"  
	>>"%U%" echo Const sWinReg = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"  
	>>"%U%" echo Const sEvtSql = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"  
	>>"%U%" echo Const SW_HIDE = 0  
	>>"%U%" echo Dim oOODesktop, aOOArgs(2), oFso, oFile, oArgs, sBaseName, sExtName, sFolder, sSrcFile, sDstFile			  

	rem Main Beg
		>>"%U%" echo If GetObject(sWinMan).ExecQuery(sBinSql).Count Then  
			>>"%U%" echo WScript.Echo ErrMsg0:  WScript.Quit 1  
		>>"%U%" echo End If  
		>>"%U%" echo Set oArgs = WScript.Arguments   
		>>"%U%" echo If oArgs.Count ^<^> 1 Then  
			>>"%U%" echo WScript.Echo ErrMsg1:  WScript.Quit 1  
		>>"%U%" echo End If  
		>>"%U%" echo sSrcFile = oArgs(0)	  
		>>"%U%" echo Set oFso = CreateObject("Scripting.FileSystemObject")  
		>>"%U%" echo sExtName = LCase(oFso.GetExtensionName(sSrcFile))  
		>>"%U%" echo Select Case sExtName  
			>>"%U%" echo Case "csv", "txt", "ods"  
			>>"%U%" echo Case Else: WScript.Echo ErrMsg2:   WScript.Quit 1  
		>>"%U%" echo End Select  
		>>"%U%" echo sBaseName = oFso.GetBaseName(sSrcFile)  
		>>"%U%" echo sFolder = oFso.GetParentFolderName(sSrcFile)  
		>>"%U%" echo If sBaseName = "*" Then  
			>>"%U%" echo Call OpenOfficeStartup  
			>>"%U%" echo For Each oFile In oFso.GetFolder(sFolder).Files  
				>>"%U%" echo If LCase(oFso.GetExtensionName(oFile)) = sExtName Then  
					>>"%U%" echo sBaseName = oFso.GetBaseName(oFile)  
					>>"%U%" echo sDstFile = oFso.BuildPath(sFolder, sBaseName ^& ".xls")  
					>>"%U%" echo Call ConvertToXls(oFile.Path, sDstFile)  
				>>"%U%" echo End If  
			>>"%U%" echo Next  
			>>"%U%" echo Call OpenOfficeTerminate  
		>>"%U%" echo ElseIf Not oFso.FileExists(sSrcFile) Then  
			>>"%U%" echo WScript.Echo ErrMsg3:   WScript.Quit 1  
		>>"%U%" echo Else  
			>>"%U%" echo sDstFile = oFso.BuildPath(sFolder, sBaseName ^& ".xls")  
			>>"%U%" echo Call OpenOfficeStartup  
			>>"%U%" echo Call ConvertToXls(sSrcFile, sDstFile)  
			>>"%U%" echo Call OpenOfficeTerminate  
		>>"%U%" echo End If  
		>>"%U%" echo Set oFso = Nothing  
		>>"%U%" echo WScript.Echo "Fertig!":   WScript.Quit 0  
	rem Main End

	>>"%U%" echo Private Sub ConvertToXls(ByRef sCsvFile, sXlsFile)  
		>>"%U%" echo Dim iCsvDelim, iCsvText, iFilter   
		>>"%U%" echo Select Case LCase(Right(sCsvFile, 3))  
			>>"%U%" echo Case "csv", "txt"  
				>>"%U%" echo iFilter = True  
			>>"%U%" echo Case "ods"  
				>>"%U%" echo iFilter = False	  
			>>"%U%" echo Case Else  
				>>"%U%" echo Exit Sub  
		>>"%U%" echo End Select  
		>>"%U%" echo aOOArgs(0).Name = "Hidden"  
		>>"%U%" echo aOOArgs(0).Value = True  
		>>"%U%" echo aOOArgs(1).Name = "FilterName"  
		>>"%U%" echo aOOArgs(1).Value = ""  
		>>"%U%" echo aOOArgs(2).Name = "FilterOptions"  
		>>"%U%" echo aOOArgs(2).Value = ""   
		>>"%U%" echo iCsvDelim = Asc(CsvDelim):  iCsvText = Asc(CsvText)  
		>>"%U%" echo If iFilter Then     'Argumente nur für *.csv und *.txt  
			>>"%U%" echo aOOArgs(1).Value = "Text - txt - csv (StarCalc)"  
			>>"%U%" echo aOOArgs(2).Value = Join(Array(iCsvDelim, iCsvText, CsvChar, CsvStart), ",")  
		>>"%U%" echo End If  
		>>"%U%" echo With oOODesktop.LoadComponentFromURL(GetURL(sCsvFile), "_blank", 0, aOOArgs)  
			>>"%U%" echo aOOArgs(1).Value = "MS Excel 97"  
			>>"%U%" echo aOOArgs(2).Value = ""  
			>>"%U%" echo .storeAsURL GetURL(sXlsFile), aOOArgs  
			>>"%U%" echo .Close False  
		>>"%U%" echo End With  
	>>"%U%" echo End Sub  

	>>"%U%" echo Private Sub OpenOfficeStartup()  
		>>"%U%" echo Dim i  
		>>"%U%" echo Call LoadOpenOfficeProcess  
		>>"%U%" echo With CreateObject("com.sun.star.ServiceManager")  
			>>"%U%" echo For i = 0 To UBound(aOOArgs)  
			>>"%U%" echo Set aOOArgs(i) = .Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
			>>"%U%" echo Next  
			>>"%U%" echo Set oOODesktop = .createInstance("com.sun.star.frame.Desktop")  
		>>"%U%" echo End With  
	>>"%U%" echo End Sub  

	>>"%U%" echo Private Sub LoadOpenOfficeProcess()  
		>>"%U%" echo Dim oConfig, oEventSrc, oEvent, sExeFile, sExeFolder, iPID  
		rem Den Pfad der OpenOffice-Soffice.Exe in der Registry ermitteln
		>>"%U%" echo sExeFile = GetSofficeExePath(iHKCU)  
		>>"%U%" echo If IsEmpty(sExeFile) Then sExeFile = GetSofficeExePath(iHKLM)  
		rem OpenOffice-Programm-Verzeichnis ermitteln
		>>"%U%" echo sExeFolder = oFso.GetParentFolderName(sExeFile)  
		>>"%U%" echo If sExeFolder = "" Then WScript.Echo ErrMsg4:  WScript.Quit 1  
		rem OpenOffice ohne GUI versteckt öffnen und warten bis der Prozess vollständig geladen ist
		>>"%U%" echo With GetObject(sWinMan)  
			>>"%U%" echo Set oConfig = .Get("Win32_ProcessStartup").SpawnInstance_:  oConfig.ShowWindow = SW_HIDE  
			>>"%U%" echo Set oEventSrc = .ExecNotificationQuery(sEvtSql)  
			>>"%U%" echo If .Get("Win32_Process").Create(sExeFile ^& " -invisible", sExeFolder, oConfig, iPID) Then  
				>>"%U%" echo WScript.Echo ErrMsg4:  WScript.Quit 1  
			>>"%U%" echo End if  
			>>"%U%" echo Do  
				>>"%U%" echo Set oEvent = oEventSrc.NextEvent()  
				>>"%U%" echo If oEvent.TargetInstance.Name = "soffice.bin" And oEvent.TargetInstance.ParentProcessID = iPID Then  
					>>"%U%" echo Exit Do  
				>>"%U%" echo End If  
			>>"%U%" echo Loop  
		>>"%U%" echo End With  
	>>"%U%" echo End Sub  

	>>"%U%" echo Private Sub OpenOfficeTerminate()  
		>>"%U%" echo Dim i  
		>>"%U%" echo oOODesktop.Terminate:   Set oOODesktop = Nothing  
		>>"%U%" echo For i = 0 To UBound(aOOArgs)  
			>>"%U%" echo Set aOOArgs(i) = Nothing  
		>>"%U%" echo Next  
	>>"%U%" echo End Sub  

Rem Absolute/Relative Pfade ins OO-URL-Format konvertieren

	>>"%U%" echo Private Function GetURL(ByRef sFilename)  
		>>"%U%" echo Dim sChars, sClient, i  
		>>"%U%" echo If Left(sFilename, 2) = "\\" Then sClient = "File:" Else sClient = "File:///"  
		>>"%U%" echo sChars = Array("\", "/", "%", "%25", " ", "%20")  
		>>"%U%" echo GetURL = sClient ^& oFso.GetAbsolutePathName(sFilename)  
		>>"%U%" echo For i = 0 To UBound(sChars) Step 2  
			>>"%U%" echo GetURL = Replace(GetURL, sChars(i), sChars(i + 1))  
		>>"%U%" echo Next  
	>>"%U%" echo End Function  

	>>"%U%" echo Private Function GetSofficeExePath(iHKey)  
		>>"%U%" echo Dim aRegValues, sExePath  
		>>"%U%" echo With GetObject(sWinReg)  
		>>"%U%" echo .EnumKey iHKey, sRegKey, aRegValues  
			>>"%U%" echo If IsArray(aRegValues) Then  
				>>"%U%" echo If IsNumeric(aRegValues(0)) Then  
					>>"%U%" echo .GetStringValue iHKey, sRegKey ^& aRegValues(0), sRegValue, sExePath  
				>>"%U%" echo End If  
			>>"%U%" echo End If  
		>>"%U%" echo End With  
		>>"%U%" echo GetSofficeExePath = sExePath  
		>>"%U%" echo End Function  
		
rem ====================================================================
rem CSV to XLS
rem ====================================================================
	echo ____________________________________	
	echo CSV-Datei wird in XLS umgewandelt. Bitte Warten...
	cscript //nologo "%U%" "%Aus%"  

rem ====================================================================
rem Erstellung des VBS zum Mailversand
rem ====================================================================
	Set "M=%temp%\Mailversand.vbs"  
	>"%M%" echo Dim objMail,objConfig,objFields  
	>>"%M%" echo Set objMail = CreateObject("CDO.Message")  
	>>"%M%" echo Set objConfig = CreateObject("CDO.configuration")  
	>>"%M%" echo Set objFields = objConfig.Fields  
	>>"%M%" echo With objFields  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/SendUsing")= 2  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")= "mail.gmx.net"  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")= 1  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/SMTPServerPort")= 25  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "Mail"  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "PW"  
	>>"%M%" echo   .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true  
	>>"%M%" echo   .Update  
	>>"%M%" echo End With  
	>>"%M%" echo With objMail  
	>>"%M%" echo   Set .Configuration = objConfig  
	>>"%M%" echo   .To = "%Mail%"  
	>>"%M%" echo   .From = "Mail"  
	>>"%M%" echo   .Subject = "Thuengen Daten"  
	>>"%M%" echo   .TextBody = "Thuengen Daten"  
	>>"%M%" echo   .AddAttachment "%Send%"  
	>>"%M%" echo   .Send  
	>>"%M%" echo End With  
	
	echo ____________________________________
	echo Ich versende nun die Dateien an %Mail%. Bitte Warten...
	cscript //nologo "%M%"  

	pause
	
rem ====================================================================
rem Versendete Anhänge löschen
rem ====================================================================
	del /Q "C:\Datenversand\Th*"  
Member: bastla
bastla Jul 19, 2012 updated at 15:29:23 (UTC)
Goto Top
Hallo ColdZero89!

Ändere die Zeile 224 (hatte ich vorher leider übersehen face-sad) auf:
>>"%U%" echo sChars = Array("\", "/", "%%", "%%25", " ", "%%20")
Um in Batch ein einzelnen Prozentzeichen auszugeben, musst Du zwei schreiben (wie in VBS mit den Anführungszeichen) ...

Grüße
bastla
Mitglied: 76109
76109 Jul 19, 2012 updated at 15:31:13 (UTC)
Goto Top
Hallo Zero!

Jepp, da hat Batch noch äh bissl was verschluckt und zwar:
sChars = Array("\", "/", "25", " ", "0")
Anstatt:
sChars = Array("\", "/", "%", "%25", " ", "%20")
Denke mal mit Prozentzeichen verdoppeln, sollte es gehenface-wink

Gruß Dieter

bastla ist zu schnell für michface-wink
Member: ColdZero89
ColdZero89 Jul 19, 2012 updated at 15:33:55 (UTC)
Goto Top
Moinsen face-big-smile

gepriesen solltet ihr sein! face-big-smile

Im ernst? Da hätte ich auch selbst drauf kommen können... sowas sagte mir bastla nämlich schonmal... grml ^-^

Ich danke euch echt vielmals face-big-smile Script funktoniert nun 1a.

Schönen Abend euch noch.

Gruß Zero

P.S.: Ach du musst dich nur kürzer fassen Dieter ;P
Mitglied: 76109
76109 Jul 19, 2012 at 15:43:54 (UTC)
Goto Top
Hallo Zero!

Ich danke euch echt vielmals Script funktoniert nun 1a.
Gottseidankface-smile

P.S.: Ach du musst dich nur kürzer fassen Dieter ;P
Gute Idee, werde ich mir merkenface-wink

Gruß Dieter