dtbsys
Goto Top

Per Batch in Aufgabeplanung XLS in CSV umwandeln

Hallo und guten Morgen,

leider habe ich in den zahlreichen Beiträgen zu dem Thema nichts passendes gefunden.

Ich bekomme wöchentlich eine XLS zugesandt, kann diese aber nur als CSV verarbeiten. Die XLS liegt in einem Ordner auf dem WIN Server. Die Konvertierung in CSV sollte per Batch automatisch funktionieren. Schreibe ich da am besten eine .cmd und führe diese einfach per Aufgabenplanung aus? Wie schaffe ich es, dass die CSV richtig konvertiert wird. Also mit ";" getrennt und als Dezimaltrennzeichen ein ","...

Kann mir da möglicherweise jemand einen Tipp geben?

Schon einmal vielen Dank und schöne Grüße

Content-ID: 324542

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

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

H41mSh1C0R
H41mSh1C0R 22.12.2016 um 09:00:37 Uhr
Goto Top
Hi,

warum keine Pòwershell?

$xlCSV = 6
$Excel = New-Object -Com Excel.Application 
$Excel.visible = $False 
$Excel.displayalerts=$False 
$WorkBook = $Excel.Workbooks.Open("DEINEEXCELDATEI.XLS")   
$Workbook.SaveAs("DEINEEXCELDATEIALSCSV.csv",$xlCSV)   
$Excel.quit()

Lass mal das als Powershellscript laufen.

ggf. die Option 23 ausprobieren.
$xlCSV = 23

Was bekommst du als Ausgabe?

VG
131381
131381 22.12.2016 aktualisiert um 09:05:06 Uhr
Goto Top
$Excel.displayalerts=$False  
Nur zur Info: Das solltest du vor dem Quit wieder rückgängig machen, da diese Einstellung permanent ist und der User sonst nach dem Ausführen überhaupt keine Warndialoge mehr zu Gesicht bekommt face-wink

Gruß mik
dtbsys
dtbsys 22.12.2016 um 17:19:20 Uhr
Goto Top
Wow, das ging ja schnell, damit hätte ich nicht gerechnet. Respekt - Admin.de halt!

Habe mich mal ein wenig in die PowerShell eingelesen und Dein Skript ausgeführt. Leider kommt aktuell noch die untenstehende Fehlermeldung. Ist es wichtig wo die ps1 Datei liegt oder sucht das wild überall rum? Habe die ps1 erst in einen Ordner unterhalb der xls Datei abgespeichert, anschließend die ps1 direkt in den Ordner in welcher sich das xls File befindet kopiert und ausgeführt. Die XLS wird aber trotzdem nicht gefunden.

Habe es auch mal mit "23" versucht, aber ich glaube das hat wohl weniger mit der Fehlermeldung zu tun. Mache ich grundsätzlich was falsch?

LG face-smile


Ausnahme beim Aufrufen von "Open" mit 1 Argument(en): "Wir konnten 'exl-1606621.xls' nicht finden. Wurde das Objekt vielleicht verschoben, umbenannt oder
gelöscht?"
In C:\SHARES\...\...\XLSinCSV.ps1:5 Zeichen:1

back-to-top$WorkBook = $Excel.Workbooks.Open("exl-1606621.xls")

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile , MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\SHARES\...\...\XLSinCSV.ps1:6 Zeichen:1

back-to-top$Workbook.SaveAs("exl-1606621.csv",$xlCSV)

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile , RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
131381
131381 22.12.2016 aktualisiert um 17:58:28 Uhr
Goto Top
Gib die kompletten absoluten Pfade zu den Dateien in Zeile 5 und 6 an!

Gruß
dtbsys
dtbsys 22.12.2016 um 19:51:29 Uhr
Goto Top
Hey Mikrotik, bist ja ne richtige Wuchtbrumme ;o) geht.... FAST!

Die haben in die Excel ein Makro eingebaut, welches bei der Konvertierung blöde Fragen stellt...:

Private Sub Workbook_Open()
' Ask customer whether to remove the inverted comma
Dim strMsg As String
strMsg = "Soll das ....-Makro die Apostroph-Zeichen entfernen? Dieser Vorgang wird empfohlen und kann einige Minuten dauern."
If MsgBox(strMsg, vbYesNo, ".... Macro") = vbYes Then
Dim objCell As Range
Dim objUsed As Range
Set objUsed = ActiveSheet.UsedRange
objUsed.NumberFormat = "@"
For Each objCell In objUsed
If objCell.PrefixCharacter = "'" Then
objCell.Value = CStr(objCell.Value)
End If
Next
End If
End Sub

1. Kann man die Frage mit dem Apostrophen entfernen event. automatisch beantworten? Brauche das Entfernen nicht...
2. Dann das Überschreiben der bestehenden Datei funktioniert auch nicht automatisch... muss beantwortet werden: überschreiben ja/nein

Kann man das event. alles autom. beantworten?

LG
H41mSh1C0R
H41mSh1C0R 23.12.2016 aktualisiert um 14:47:32 Uhr
Goto Top
Wenn du das Entfernen, also das Ausführen des VBS Scriptes nicht benötigst füge folgende Zeile ein.

$Excel.AutomationSecurity = 'msoAutomationSecurityForceDisable'  

Somit sollte generell KEIN VBS ausgeführt werden beim öffnen der Excel.

VG
dtbsys
dtbsys 23.12.2016 um 14:44:34 Uhr
Goto Top
CSV wird nun sauber erstellt. Keine Fragen mehr und Datei wird überschrieben... Klasse! Danke!

Allerdings klappt das automatische Triggern per Aufgabensteuerung nicht face-sad Wenn ich die ps1 manuell ausführe klappts, manuell über die Aufgabeplanung angestoßen nicht.

Starte in der Aktion - bearbeiten mit: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe danach als Argument den kompletten Pfad zur ps1... Wenn ich die Aufgabe manuell in der Aufgabenplanung anstoße, passiert aber nichts...

Hab auch schon mit höchsten Privilegien versucht...

Gibt es da noch einen Trick?
H41mSh1C0R
H41mSh1C0R 23.12.2016 aktualisiert um 14:51:29 Uhr
Goto Top
Hast du das Script in der Aufgabenplanung so eingetragen?

-command "Laufwerk:\Pfad\Skript.ps1"  

https://www.antary.de/2013/08/16/powershell-skript-als-geplante-aufgabe- ...
131381
131381 23.12.2016 aktualisiert um 15:32:54 Uhr
Goto Top
Über die Aufgabenplanung sind Prozesse erstens nicht sichtbar wenn man sie mit einem anderen Account ausführt, nur über den Taskmanager.
Zweitens sollte entweder die Executionpolicy angepasst sein oder man startet sie per Bypass-Command.

Als Exe eintragen
powershell.exe
Unter Argumente:
-Executionpolicy Bypass -File "c:\script.ps1"

Wenn man stattdessen -command nutzt muss man bei Pfaden mit Leerzeichen beachten
-command "&'c:\pfad mit Leerzeichen\script.ps1'"
dtbsys
dtbsys 23.12.2016 um 16:58:46 Uhr
Goto Top
Beide Befehle funktionieren nicht. Ich glaube ich fange an Powershell nicht zu mögen... face-sad

Wenn ich manuell starte, kommt ein Fenster in welchem ich mit "J" bestätigen muss. Hmm.

Wenn ich über die Aufgabenplanung manuell ausführe, passiert überhaupt gar nichts. Ich habe auch keine Leerzeichen im Dateipfad. Habe beide Varianten versucht, mit -Executionpolicy Bypass -File und auch mit -command "&... keinerlei Reaktion. Die Executionpolicy kenne ich nicht. Ist das die oberste Policy in der Gruppenrichtlinienverwaltung?
dtbsys
dtbsys 23.12.2016 aktualisiert um 17:52:32 Uhr
Goto Top
Es steht bei: Ergebnis der letzten Ausführung: Der Vorgang wurde erfolgreich beendet (0X0)... Aber nixx is passiert, keine CSV erstellt. Verstehe ich nicht!

Habe auch verschiedene Benutzer getestet und Set-ExecutionPolicy Unrestricted per Powershell auf J gesetzt. Über die Aufgabenplanung will die ps1 nicht laufen.
131381
131381 23.12.2016 aktualisiert um 21:21:37 Uhr
Goto Top
Typische Angängerprobleme.
Bau ein Logging in die PS1 ein (Start-Transcript) und du weißt sofort was Sache ist.

Gruß und frohes Fest.
dtbsys
dtbsys 26.12.2016 um 13:35:40 Uhr
Goto Top
Hey mikrotik,

hast mir wirklich toll geholfen, die PS Datei geht schließlich. Das Starten über die Aufgabenplanung schaffe ich aber nicht und mit dem Logging kann ich auch keinen Krieg gewinnen. Ärgert mich tierisch, da es ja manuell funktioniert. Ich habe aber nicht die Zeit mich mit PS Problemen auseinanderzusetzen. Das hat mich jetzt schon einiges an Zeit gekostet. Werde es wohl nun per normalem Batch oder sonst irgendwie versuchen.

Ganz liebe Grüße und nochmals danke face-smile
131381
131381 27.12.2016 aktualisiert um 13:36:15 Uhr
Goto Top
Das Excel dafür auf der Maschine installiert sein muss sollte klar sein, es wird ja das COM-Objekt von Excel benutzt welches nur verfügbar ist wenn Excel installiert ist. face-wink. Geht hier testweise ohne Probleme auch im Taskplaner, also hast du entweder ein Berechtigungsproblem, Excel ist nicht installiert oder du hast den Task falsch eingestellt.
dtbsys
dtbsys 27.12.2016 um 17:38:21 Uhr
Goto Top
Habe mit verschiedenen Benutzern, auch mit meinem Domain-Admin (den ich kurzzeitig auch lokale Adminrechte gegeben habe), getestet. Manuell geht's ja. Großes Office Paket 2016 ist drauf. Ich habe die Ausführungsrichtlinie aufgemacht, also für mich als User (Adminrechte) auf UNRESTRICTED umgestellt.

PS C:\Windows\system32> Get-ExecutionPolicy -Scope CurrentUser
Unrestricted

Allerdings kommt bei manuell ausführen trotzdem die Abfrage ob ich die Ausführungsrichtlinie auf J setzen möchte.

Bei dem Task habe ich viele verschiedenen Varianten ausprobiert, auch um die Policy zu umgehen. Deine Vorschläge und einige andere gefundenen Befehle. Bin mit meinem Latein am Ende und eben auch kein Profi für Powershell. Event. liegt es an der Policy, wüsste aber nicht was ich bez. Sicherheit noch aufmachen könnte. Gruppenrichtlinie könnte ich anpassen, aber ich möchte eben nicht komplett aufmachen.
131381
131381 27.12.2016 aktualisiert um 17:53:51 Uhr
Goto Top
Die Executionpolicy gibt es für 64-Bit sowie 32-BIt-Konsolen. Für deinen Fall bei dem du ein 32-Bit Office nutzt solltest du auch die 32-Bit Konsole nutzen also auch dort die Executionpolicy freischalten und im Task die 32-Bit Powershell exe angeben.

Um beide Policies auf einen Schlag zu setzen gebe folgendes ein
Set-ExecutionPolicy RemoteSigned -Force; start-job {Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
Dann ist die policy für beide Konsolen-Typen freigeschaltet.
Jetzt brauchst du nur noch die 32bit exe im Task angeben, fertig, läuft.

Gruß
dtbsys
dtbsys 28.12.2016 um 01:24:53 Uhr
Goto Top
Gibst wirklich nicht so schnell auf... Respekt! ;o)

Deinen Befehl habe ich ausgeführt... Diese Info kommt dann:
Set-ExecutionPolicy : Die Ausführungsrichtlinien wurden von Windows PowerShell erfolgreich aktualisiert, die Einstellung wird jedoch von einer in einem spezielleren Bereich definierten Richtlinie überschrieben. Aufgrund der Überschreibung wird die aktuelle geltende Ausführungsrichtlinie "Unrestricted" für die Shell beibehalten. Geben Sie "Get-ExecutionPolicy -List" ein, um die Ausführungsrichtlinieneinstellungen anzuzeigen.

Das als Ergebnis:

PS C:\Windows\system32> Get-ExecutionPolicy -List

Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Unrestricted
LocalMachine RemoteSigned


In der Aufgabenplanung habe ich aktuell stehen:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe (ohne Anführungszeichen)
Argumente hinzufügen: -command "&'C:\SHARES\...\...\XLSinCSV\XLSinCSV.ps1'"


Will aber trotzdem nicht, wenn ich auf "Ausführen" gehe... Arbeite gerade mit der PS auf einem Server 2012 R2. Gibt es dort event. andere Sicherheitsrichtlinien für PS?
131381
131381 28.12.2016 aktualisiert um 08:49:05 Uhr
Goto Top
Wie ich schon oben geschrieben habe, gebe in der Aufgabenplanung den Pfad zu 32-Bit Powershell exe an. Und ich hoffe die UAC ist aus.
Gibt es dort event. andere Sicherheitsrichtlinien für PS?
Nein.

Hier getestet sowohl auf SRV2012R2 als auch 2016, alles einwandfrei. Sorry du scheinst einfach einen Fehler zu machen den ich hier nicht sehen kann.
131381
131381 28.12.2016 aktualisiert um 18:09:31 Uhr
Goto Top
Erstelle mal in folgenden Verzeichnissen einen Ordner namens Desktop:
C:\Windows\SysWOW64\config\systemprofile\Desktop
C:\Windows\system32\config\systemprofile\Desktop


Oder alternativ dazu öffne mit WIN+R - > dcomcnfg
Öffne dann die Eigenschaften von Microsoft Excel Application

screenshot

Und stelle auf dem TAB Identity den User ein unter dem du den Task ausführst

screenshot

Dann muss es definitiv laufen.

Wenn nicht statte es mit Logging aus wie ich oben geschrieben habe:
Pfad zum Logfile und den Dateien bitte anpassen.
Start-Transcript -Path "C:\temp\error.log"  
# Quelldatei
$quelle = 'C:\temp\daten.xlsx'  
# Zieldatei
$ziel = 'C:\temp\daten.csv'  

$objExcel = New-Object -Com "Excel.Application"  
$wb = $objExcel.Workbooks.Open($quelle)
$objExcel.Visible = $false
$objExcel.DisplayAlerts = $false
$objExcel.AutomationSecurity = 'msoAutomationSecurityForceDisable'  
$wb.SaveAs($ziel,6)
$objExcel.DisplayAlerts = $true
$wb.Close($false)
$objExcel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)
Stop-Transcript

Gruß mik
AbsolutNeu
AbsolutNeu 17.01.2017 um 16:11:42 Uhr
Goto Top
Hey mikrotik,

vielen Dank für die schnelle Hilfe!
Also die beiden Ordner habe ich soeben erstellt. Jedoch habe ich den Eintrag Microsoft Excel.Application in den Komponentendiensten erst garnicht?! Ich bin etwas verwirrt...
unbenannt
AbsolutNeu
AbsolutNeu 17.01.2017 um 16:20:59 Uhr
Goto Top
Problem gelöst!
Nochmals vielen vielen Dank! Ich habe den Eintrag "Microsoft Visual Studio Tools for Application" zusätzlich zu dem erstellen der beiden Ordner angepasst und siehe da, es läuft!

Echt klasse! Du bist der hammer!