Beiträge von Neklor
-
-
-
Hi,
ich suche nach einem Befehl oder ähnlichem, um mit einem AutoIT Script zu prüfen ob das aktive Mikrofon stumm geschaltet ist (in Windows 10).
Ich habe aber leider nicht viel finden können, am dichtesten dran scheint mir dieses Script zu sein: https://www.autoitscript.com/forum/topic/16…enable-disable/
Leider listet das Script aber nur einige Devices auf, welche nicht nach meinen Micros aussehen und gemuted wird auch nichts.
Ich habe auch Infos gefunden, dass man den Status in der Registry sehen und ändern kann:
Aber egal was ich mache, da ändert sich nichts und eine Änderung hat auch keinen Effekt.
Unter Systemsteuerung --> Sound --> Aufnahme --> Microphone --> Pegel kann man auf das Lautpsrecher Symbol klicken, dann ist es gemuted. Leider konnte ich mit Process Explorer nicht rausfinden was da im Hintergrund passiert. Nach dem klick ist das Symbol durchgestrichen und zeigt den Mute Zustand an, aber offenbar auch nicht generell.
Drücke ich die Mute Taste an meinem Headset, änder sich dieses Symbol nicht, ich bin aber gemuted. Betätige ich den eben genannten Knopf, muted sich aber auch mein Headset (Jabra Engage 75).
Kennt jemand eine Möglichkeit den Mute Status aller (oder auch nur des aktiven) Mikros abzufragen und zu ändern?
-
Ich würde der Funktion aber einen anderen Namen geben, denn wenn du für etwas anderes nochmal die file.au3 einbinden musst wirst du vermutlich Probleme bekommen wenn du eine eigene Funktion mit gleichem Namen deklariert hast.
Ja, guter Hinweis, vermutlich würde ich das nach einiger Zeit vergessen
Ich hab das ganze Script nochmal überarbeitet, war irgendwie noch recht Fehleranfällig.
Ich hab das auch oben mal geändert, falls es sich jemand kopiert. -
Dann verwende eben stattdessen die nativen Funktionen
[autoit]
[/autoit]
fileopen
fileread
filewriteund gib den entsprechenden Modus (UTF-8 ohne BOM) vor.
EDIT:
Oder wenn es unbedingt aus Faulheit die Filewritetoline Funktion sein soll schau in die file.au3, such dir die Funktion raus und erstell dir eine angepasste Kopie davon.
Hier einfach die Funktionsaufrufe für fileopen, fileread , filewrite entsprechend abändern und dann als _MY_filewritetoline() in dein Script einbinden...
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
; #FUNCTION# ====================================================================================================================
; Name...........: _FileWriteToLine
; Description ...: Writes text to a specific line in a file.
; Syntax.........: _FileWriteToLine($sFile, $iLine, $sText[, $fOverWrite = 0])
; Parameters ....: $sFile - The file to write to
; $iLine - The line number to write to
; $sText - The text to write
; $fOverWrite - If set to 1 will overwrite the old line
; |If set to 0 will not overwrite
; Return values .: Success - 1
; Failure - 0
; @Error - 0 = No error
; |1 = File has less lines than $iLine
; |2 = File does not exist
; |3 = Error when opening file
; |4 = $iLine is invalid
; |5 = $fOverWrite is invalid
; |6 = $sText is invalid
; Author ........: cdkid
; Modified.......: partypooper, MrCreatoR
; Remarks .......: If _FileWriteToLine is called with $fOverWrite as 1 and $sText as "", it will delete the line.
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func _FileWriteToLine($sFile, $iLine, $sText, $fOverWrite = 0)
If $iLine <= 0 Then Return SetError(4, 0, 0)
If Not IsString($sText) Then
$sText = String($sText)
If $sText = "" Then Return SetError(6, 0, 0)
EndIf
If $fOverWrite <> 0 And $fOverWrite <> 1 Then Return SetError(5, 0, 0)
If Not FileExists($sFile) Then Return SetError(2, 0, 0)Local $sRead_File = FileRead($sFile)
[/autoit] [autoit][/autoit] [autoit]
Local $aSplit_File = StringSplit(StringStripCR($sRead_File), @LF)
If UBound($aSplit_File) < $iLine Then Return SetError(1, 0, 0)
Local $hFile = FileOpen($sFile, $FO_OVERWRITE)
If $hFile = -1 Then Return SetError(3, 0, 0)$sRead_File = ""
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $aSplit_File[0]
[/autoit] [autoit][/autoit] [autoit]
If $i = $iLine Then
If $fOverWrite = 1 Then
If $sText <> '' Then $sRead_File &= $sText & @CRLF
Else
$sRead_File &= $sText & @CRLF & $aSplit_File[$i] & @CRLF
EndIf
ElseIf $i < $aSplit_File[0] Then
$sRead_File &= $aSplit_File[$i] & @CRLF
ElseIf $i = $aSplit_File[0] Then
$sRead_File &= $aSplit_File[$i]
EndIf
NextFileWrite($hFile, $sRead_File)
[/autoit] [autoit][/autoit] [autoit]
FileClose($hFile)Return 1
[/autoit]
EndFunc ;==>_FileWriteToLine
Super, Danke!
Darauf hätte ich ja auch kommen könnenIch habe jetzt erstmal mein Script auf die AutoIt Beta angepasst, da hat sich offenbar was geändert. Ich habe dann _FileReadToArray in FileReadToArray geändert, das funzt.
Der Fehler entsteht aber nur beim speichern, also habe ich mir _FileWritToLine ins Script geholt und ein paar Tests damit gemacht.Hier liegt das Problem:
[autoit]Local $hFileOpen = FileOpen($sFilePath, FileGetEncoding($sFilePath) + $FO_OVERWRITE)
[/autoit]Offenbar funktioniert an der Stelle kein FileGetEncoding, hat wohl niemand getestet...
Ich habe es geändert in:
[autoit]Local $hFileOpen = FileOpen($sFilePath, $FO_UTF8_NOBOM + $FO_OVERWRITE)
[/autoit]Das klappt jetzt
Ich habe das Script oben jetzt gegen die funktionierende Version ausgetauscht, vieleicht hilft das ja nochmal jemanden bei so einem Problem
-
Eventuell kannst du mit
[autoit]
[/autoit]
StringToBinary
BinaryToString
etwas erreichen.Gruß
Hi,
[autoit]
danke für den Tipp, aber offenbar ensteht das Problem beim speichern der Datei:_FileWriteToLine($file2, $start2, '<p class="pcont2">' & $asplit[1] & '</p><br />', 0)
[/autoit]Hier wird die Datei zu ANSI. Wenn ich mir mal FileOpen anschaue, so kann man da definieren, wie die Daten verarbeite werden sollen.
Leider funktioniert _FileWriteToLine wohl nur mit dem Dateipfad und man kann keine Kodierung angeben. Hat noch jemand eine Idee zur Lösung? -
Hi,
danke schonmal für die bisherige Hilfe, ich gebe zu das ist schwer zu verstehen, daher erkläre ich jetzt mal anhand von Screenshots was passiert.Datei wir mit Expression Web 4 oder Notepad++ bearbeitet. Ergebnis:
[Blockierte Grafik: http://www.neklor.de/img/autoit/manuell.jpg]Dann die bearbeitung mit dem Script. Ergebnis:
[Blockierte Grafik: http://www.neklor.de/img/autoit/tool.jpg]Das Problem entsteht aber schon lokal, wenn ich die Datei mit Expression Web 4 öffne, sieht man das Problem, alle Umlaute sind durch ? ersetzt.
Ersetze ich diese wieder gegen Umlaute uns speichere das ganze, dann ist nach dem Upload alles OK.
Ansicht im Expression web 4:
[Blockierte Grafik: http://www.neklor.de/img/autoit/quellcode_expressionweb4.jpg]Öffne ich die durchs Script veränderte Datei statt im Expression Web 4 im Notepad++, so sehen alle Umlaute normal aus:
[Blockierte Grafik: http://www.neklor.de/img/autoit/quellcode_notepadplus.jpg]Ich vermute also, es ändert sich was am Dateiformat selbst...
Im Editor von Windows sieht übrigens auch alles normal ausIch habe beide Dateien verglichen, der Inhalt ist identisch, aber im Notepad++ wird das Problem sichtbar:
Die unbearbeitete Datei hat die Kodierung: UTF-8 ohne BOM
Die durchs Script bearbeitete Datei hat die Kodierung: ANSI
Wie kriege ich die mit Autoit wieder ins richtige Format? -
So, ich habe mal aufgeräumt und in der php Datei mal was mit Umlaut ergänzt, sowie das charset in php definiert.
Mein Problem ist, dass es ja sonst funktioniert.
Bearbeite ich die Datei normal und lade sie dann hoch, brauch ich kein ö usw. definieren, dass umzubauen wäre ein imenser Aufwand.
Wenn ich aber die Datei mit dem Script bearbeite, so sind zwar noch alle Umlaute normal, wenn ich diese dann aber hochlade passt es nicht.
Ich verwende extra utf-8 aber offenbar reicht die definition im quelltext nicht aus, bei php muss die Datei selbst im richtigen Format sein.
Leider verändert das Script etwas an der Datei und ich weiss nicht was es ist.Ich hoffe ich habe es nun besser erklärt und ihr könnt mir helfen
-
Hi,
ich habe für nen Kumpel mal fix ein Script geschrieben mit der er nen Teil seiner Webseite Updaten kann.
Eigentlich nicht schwer, leider werden mir irgenwo die Umlaute zerhackt. Ich vermute bei _FileWriteToLine
Kennt jemand eine Lösung für das Problem?Es gibt noch ein zweites Problem, wenn jemand zufällig den Fehler findet bitte melden, ansonsten such ich den später selbst:
Nach einer aktualisierung verdoppelt sich beim nächsten mal der letzte Eintrag, starte ich das Script neu passiert das nicht.Ansonsten funktioniert das Script einwandfrei
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
;*****************************************
;Erstellt mit ISN AutoIt Studio v. 0.95 BETA
;*****************************************
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include "Forms\gui.isf"
; -- Created with ISN Form Studio 2 for ISN AutoIt Studio -- ;
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>
#include <ListViewConstants.au3>
#include <GuiListView.au3>
#include <FTPEx.au3>
Global $aArray
Global $start
Global $ende
Global $fpath = @ScriptDir & "\ergebnisse.php"
Global $rfile = 'ergebnisse.php'
$server = ' '
$username = ' '
$pass = ' '
$gui = GUICreate("Update Ergebnisse",722,523,-1,-1,-1,-1)
$btn_hoch = GUICtrlCreateButton("Hoch",588,401,100,30,-1,-1)
$btn_runter = GUICtrlCreateButton("Runter",588,450,100,30,-1,-1)
Global $liste = GUICtrlCreatelistview("Titel |Text ",40,190,534,309,-1,512)
$inp_titel = GUICtrlCreateInput("",80,57,290,21,-1,512)
GUICtrlCreateLabel("Titel:",50,60,26,15,-1,-1)
GUICtrlSetBkColor(-1,"-2")
GUICtrlCreateLabel("Text:",50,100,24,15,-1,-1)
GUICtrlSetBkColor(-1,"-2")
GUICtrlSetStyle($liste, $LVS_REPORT, $LVS_EX_FULLROWSELECT)
$inp_text = GUICtrlCreateInput("",80,97,289,20,-1,512)
$btn_add = GUICtrlCreateButton("Hinzufügen",406,53,100,30,-1,-1)
$btn_upload = GUICtrlCreateButton("Upload",590,140,100,30,-1,-1)
$btn_del = GUICtrlCreateButton("Löschen",589,320,100,30,-1,-1)
$btn_nxline = GUICtrlCreateButton("Nächste Zeile <br />",407,94,109,30,-1,-1)
GUISetState(@SW_SHOW,$gui)
;TODO: EDIT Funktion erstellen, Fehler nach dem Upload beheben (erneuter Import?)$down = _FTP_Transfer ($server, $username, $pass, $fpath, $rfile, 0)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If $down Then
MsgBox(16, "Fehler", "Es ist ein Fehler beim Download aufgetreten!")
Exit
EndIf
_importData ()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $btn_add
GUICtrlCreateListViewItem(GUICtrlRead($inp_titel) & "|" & GUICtrlRead($inp_text), $liste)
Case $btn_del
_GUICtrlListView_DeleteItemsSelected($liste)
Case $btn_nxline
$tmptxt = GUICtrlRead($inp_text)
GUICtrlSetData($inp_text, $tmptxt & "<br />")
GUICtrlSetState($inp_text, $GUI_FOCUS)
Send("{RIGHT}")
Case $btn_runter
_GUICtrlListView_MoveItems($gui, $liste,1)
Case $btn_hoch
_GUICtrlListView_MoveItems($gui, $liste,-1)
Case $btn_upload
GUICtrlSetState ($btn_upload, $GUI_Disable)
_writeData ()
$up = _FTP_Transfer ($server, $username, $pass, $fpath, $rfile, 1)
GUICtrlSetState ($btn_upload, $GUI_Enable)
If $up Then
MsgBox(16, "Fehler", "Es ist ein Fehler beim Upload aufgetreten!")
Else
MsgBox(0, "Erfolg", "Die Übertragung wurde erfolgreich beendet!")
EndIf
MsgBox(0, "Hinweis", "Aufgrund eines noch bestehenden Fehlers, wird das Programm jetzt beendet! Für eine weitere Anpassung starten Sie das Programm bitte neu!")
Exit
EndSwitch
Sleep(10)
WEndFunc _importData()
[/autoit] [autoit][/autoit] [autoit]
$tmpFile = FileOpen($fpath, FileGetEncoding($fpath) + $FO_READ)
$aArray = FileReadToArray($tmpFile)
If @error Then
MsgBox(0, "", "Fehler beim einlesen der Datei. Fehler: " & @error)
Exit
EndIf
; Start und Ende finden
$start = _ArraySearch($aArray, "<!--Start-->",0, 0, 0, 1)
If @error Then
MsgBox(0, "", "Fehler beim der Suche nach dem Startpunk. Fehler: " & @error)
Exit
EndIf
$ende = _ArraySearch($aArray, "<!--Ende-->",0, 0, 0, 1)
If @error Then
MsgBox(0, "", "Fehler beim der Suche nach dem Endpunk. Fehler: " & @error)
Exit
EndIf
For $i = $start To $ende
If stringinstr($aArray[$i], '<p class="pcont2">') Then
$tmp = StringTrimLeft ($aArray[$i], 18)
$tmp = StringTrimRight($tmp, 10)
$tmp2 = StringTrimRight($aArray[$i+1], 6)
GUICtrlCreateListViewItem($tmp & "|" & $tmp2, $liste)
Endif
Next
FileClose($tmpFile)
EndFuncFunc _writeData ()
[/autoit] [autoit][/autoit] [autoit]
Local $asplit
$delanzahl = ($ende) - ($start) - 1
For $i = 1 to $delanzahl
_FileWriteToLineExt($fpath, $start+2, "", 1)
If @error Then
MsgBox(0, "", "Fehler beim löschen der Zeilen in der Datei. Fehler: " & @error)
Exit
EndIf
Next
Local $itemc = _GUICtrlListView_GetItemCount ($liste)
$start2 = $start+2
For $i = 1 To $itemc
$tmp = _GUICtrlListView_GetItemTextString ($liste, $i-1)
$asplit = StringSplit($tmp, "|")
_FileWriteToLineExt($fpath, $start2, '<p class="pcont2">' & $asplit[1] & '</p><br />', 0)
If @error Then
MsgBox(0, "", "Fehler beim schreiben in die Datei. Fehler: " & @error)
Exit
EndIf
$start2 +=1
_FileWriteToLineExt($fpath, $start2, $asplit[2] & '<br />', 0)
If @error Then
MsgBox(0, "", "Fehler beim schreiben in die Datei. Fehler: " & @error)
Exit
EndIf
$start2 +=1
_FileWriteToLineExt($fpath, $start2, '<hr class="hr1" /> ', 0)
If @error Then
MsgBox(0, "", "Fehler beim schreiben in die Datei. Fehler: " & @error)
Exit
EndIf
$start2 +=1
Next
EndFunc;===============================================================================
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; Function Name: _FTP_Transfer()
; Description: Download oder Upload einer Datei von/auf einen FTP Server. (Download or upload a file from/to FTP server.)
;
; Parameter(s): $sServer - Serveradresse
; $sUser - FTP Benutzer
; $sPass - FTP Passwort
; $sFile - Dateiname mit Pfad, der lokalen Datei. Z.B.: @ScriptDir & "\test.php"
; $sRemoteFile - Dateiname auf dem Server ohne Pfad mit Erweiterung. Z.B.: test.php
; $iMode - Angabe des Modus:
; 0 Download Modus
; 1 Upload Modus
;
; Requirement(s): #include <FTPEx.au3>
;
; Return Value(s): Erfolg (On success) - 0
; Fehler (On failure) - 1
;
; Author(s): C.Krogmann (Neklor)
;===============================================================================
Func _FTP_Transfer ($sServer, $sUser, $sPass, $sFile, $sRemoteFile, $iMode)
Local $iErr = 0
Local $hOpen = _FTP_Open('MyFTP Control')
If @error Then
MsgBox(16, "Fehler", "FTP Session kann nicht gestartet werden. Fehler: " & @error)
$iErr = 1
EndIf
Local $hConn = _FTP_Connect($hOpen, $sServer, $sUser, $sPass)
If @error Then
MsgBox(16, "Fehler", "Verbindung zum FTP Server nicht möglich. Fehler: " & @error)
$iErr = 1
EndIf
If $iMode = 0 Then
_FTP_FileGet($hConn, $sRemoteFile, $sFile)
If @error Then
MsgBox(16, "Fehler", "Fehler beim Download der Datei. Fehler: " & @error)
$iErr = 1
EndIf
ElseIf $iMode = 1 Then
_FTP_FileDelete ($hConn, $sRemoteFile)
If @error Then
MsgBox(16, "Fehler", "Löschen der Datei auf dem Server nicht möglich: " & @error)
$iErr = 1
EndIf
_FTP_FilePut ($hConn, $sFile, $sRemoteFile)
If @error Then
MsgBox(16, "Fehler", "Ein Fehler ist bei der Übertragung aufgetreten: " & @error)
$iErr = 1
EndIf
Else
MsgBox(16, "Fehler", "Ungültiger Modus!")
Local $hFtpc = _FTP_Close($hConn)
Local $hFtpo = _FTP_Close($hOpen)
Exit
EndIf
Local $hFtpc = _FTP_Close($hConn)
Local $hFtpo = _FTP_Close($hOpen)
Return $iErr
EndFunc;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _GUICtrlListView_MoveItems()
; Description: Move selected item(s) in ListView Up or Down.
;
; Parameter(s): $hWnd - Window handle of ListView control (can be a Title).
; $vListView - The ID/Handle/Class of ListView control.
; $iDirection - [Optional], define in what direction item(s) will move:
; 1 (default) - item(s) will move Next.
; -1 item(s) will move Back.
; $sIconsFile - Icon file to set image for the items (only for internal usage).
; $iIconID_Checked - Icon ID in $sIconsFile for checked item(s).
; $iIconID_UnChecked - Icon ID in $sIconsFile for Unchecked item(s).
;
; Requirement(s): #include <GuiListView.au3>, AutoIt 3.2.10.0.
;
; Return Value(s): On seccess - Move selected item(s) Next/Back.
; On failure - Return "" (empty string) and set @error as following:
; 1 - No selected item(s).
; 2 - $iDirection is wrong value (not 1 and not -1).
; 3 - Item(s) can not be moved, reached last/first item.
;
; Note(s): * This function work with external ListView Control as well.
; * If you select like 15-20 (or more) items, moving them can take a while (depends on how many items moved).
;
; Author(s): G.Sandler a.k.a CreatoR (<a href='http://creator-lab.ucoz.ru' class='bbc_url' title='External link' rel='nofollow external'>http://creator-lab.ucoz.ru</a>)
;===============================================================================
Func _GUICtrlListView_MoveItems($hWnd, $vListView, $iDirection=1, $sIconsFile="", $iIconID_Checked=0, $iIconID_UnChecked=0)
Local $hListView = $vListView
If Not IsHWnd($hListView) Then $hListView = ControlGetHandle($hWnd, "", $hListView)
Local $aSelected_Indices = _GUICtrlListView_GetSelectedIndices($hListView, 1)
If UBound($aSelected_Indices) < 2 Then Return SetError(1, 0, "")
If $iDirection <> 1 And $iDirection <> -1 Then Return SetError(2, 0, "")
Local $iTotal_Items = ControlListView($hWnd, "", $hListView, "GetItemCount")
Local $iTotal_Columns = ControlListView($hWnd, "", $hListView, "GetSubItemCount")
Local $iUbound = UBound($aSelected_Indices)-1, $iNum = 1, $iStep = 1
Local $iCurrent_Index, $iUpDown_Index, $sCurrent_ItemText, $sUpDown_ItemText
Local $iCurrent_Index, $iCurrent_CheckedState, $iUpDown_CheckedState
If ($iDirection = -1 And $aSelected_Indices[1] = 0) Or _
($iDirection = 1 And $aSelected_Indices[$iUbound] = $iTotal_Items-1) Then Return SetError(3, 0, "")
ControlListView($hWnd, "", $hListView, "SelectClear")
Local $aOldSelected_IDs[1]
Local $iIconsFileExists = FileExists($sIconsFile)
If $iIconsFileExists Then
For $i = 1 To $iUbound
ReDim $aOldSelected_IDs[UBound($aOldSelected_IDs)+1]
_GUICtrlListView_SetItemSelected($hListView, $aSelected_Indices[$i], True)
$aOldSelected_IDs[$i] = GUICtrlRead($vListView)
_GUICtrlListView_SetItemSelected($hListView, $aSelected_Indices[$i], False)
Next
ControlListView($hWnd, "", $hListView, "SelectClear")
EndIf
If $iDirection = 1 Then
$iNum = $iUbound
$iUbound = 1
$iStep = -1
EndIf
For $i = $iNum To $iUbound Step $iStep
$iCurrent_Index = $aSelected_Indices[$i]
$iUpDown_Index = $aSelected_Indices[$i]+1
If $iDirection = -1 Then $iUpDown_Index = $aSelected_Indices[$i]-1
$iCurrent_CheckedState = _GUICtrlListView_GetItemChecked($hListView, $iCurrent_Index)
$iUpDown_CheckedState = _GUICtrlListView_GetItemChecked($hListView, $iUpDown_Index)
_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index)
For $j = 0 To $iTotal_Columns-1
$sCurrent_ItemText = _GUICtrlListView_GetItemText($hListView, $iCurrent_Index, $j)
$sUpDown_ItemText = _GUICtrlListView_GetItemText($hListView, $iUpDown_Index, $j)
_GUICtrlListView_SetItemText($hListView, $iUpDown_Index, $sCurrent_ItemText, $j)
_GUICtrlListView_SetItemText($hListView, $iCurrent_Index, $sUpDown_ItemText, $j)
Next
_GUICtrlListView_SetItemChecked($hListView, $iUpDown_Index, $iCurrent_CheckedState)
_GUICtrlListView_SetItemChecked($hListView, $iCurrent_Index, $iUpDown_CheckedState)
If $iIconsFileExists Then
If $iCurrent_CheckedState = 1 Then
GUICtrlSetImage(GUICtrlRead($vListView), $sIconsFile, $iIconID_Checked, 0)
Else
GUICtrlSetImage(GUICtrlRead($vListView), $sIconsFile, $iIconID_UnChecked, 0)
EndIf
If $iUpDown_CheckedState = 1 Then
GUICtrlSetImage($aOldSelected_IDs[$i], $sIconsFile, $iIconID_Checked, 0)
Else
GUICtrlSetImage($aOldSelected_IDs[$i], $sIconsFile, $iIconID_UnChecked, 0)
EndIf
EndIf
_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index, 0)
Next
For $i = 1 To UBound($aSelected_Indices)-1
$iUpDown_Index = $aSelected_Indices[$i]+1
If $iDirection = -1 Then $iUpDown_Index = $aSelected_Indices[$i]-1
_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index)
Next
EndFunc; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Original _FileWriteToLine from:
; Author ........: cdkid
; Modified.......: partypooper, MrCreatoR
;
; New Version: _FileWriteToLineExt by Neklor
; Mod........: Files will be saved in UTF-8 NOBOM now.
; ===============================================================================================================================
Func _FileWriteToLineExt($sFilePath, $iLine, $sText, $iOverWrite = 0)
If $iLine <= 0 Then Return SetError(4, 0, 0)
If Not IsString($sText) Then
$sText = String($sText)
If $sText = "" Then Return SetError(6, 0, 0)
EndIf
If $iOverWrite <> 0 And $iOverWrite <> 1 Then Return SetError(5, 0, 0)
If FileExists($sFilePath) = 0 Then Return SetError(2, 0, 0)Local $hFileOpen = FileOpen($sFilePath, FileGetEncoding($sFilePath) + $FO_READ)
[/autoit] [autoit][/autoit] [autoit]
Local $aArray = FileReadToArray($hFileOpen)
FileClose($hFileOpen)
Local $iUBound = UBound($aArray) - 1
If ($iUBound + 1) < $iLine Then Return SetError(1, 0, 0)Local $hFileOpen = FileOpen($sFilePath, $FO_UTF8_NOBOM + $FO_OVERWRITE)
[/autoit] [autoit][/autoit] [autoit]
If $hFileOpen = -1 Then Return SetError(3, 0, 0)Local $sData = ""
[/autoit] [autoit][/autoit] [autoit]
$iLine -= 1 ; Now the array is 0-based, so reduce the line number by 1.
For $i = 0 To $iUBound
If $i = $iLine Then
If $iOverWrite Then
If $sText Then $sData &= $sText & @CRLF
Else
$sData &= $sText & @CRLF & $aArray[$i] & @CRLF
EndIf
ElseIf $i < $iUBound Then
$sData &= $aArray[$i] & @CRLF
ElseIf $i = $iUBound Then
$sData &= $aArray[$i]
EndIf
NextFileWrite($hFileOpen, $sData)
[/autoit]
FileClose($hFileOpen)
Return 1
EndFunc ;==>_FileWriteToLineergebnisse.php
Achtung: Ab <!--Start--> fangen alle zeilen eigentlich ohne Leerzeichen vorweg an, ist hier wohl ein anzeigefehler im forum.Spoiler anzeigen
PHP
Alles anzeigen<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <? header("Content-Type: text/html; charset=utf-8"); ?> <head> <meta content="de" http-equiv="Content-Language" /> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>Test</title> <link href="style.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="wrapper"> <div id="header"> <? include ("head.php"); ?> </div> <div id="navi"> <? include ("nav.php"); ?> </div> <div id="content" align="center"> <? include ("head.php"); ?> <div id="content2" align="center"> <hr class="hr1" /> <!--Start--> <p class="pcont2">Testevent1</p><br /> von März 2013 - Dezember 2013, 123 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent2</p><br /> von November 2013 - Dezember 2013, 124 Südöstliche Stadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent3</p><br /> von November 2013 - Dezember 2013, 125 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent4</p><br /> von November 2013 - Dezember 2013, 126 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent5</p><br /> von November 2013 - Dezember 2013, 127 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent6</p><br /> von November 2013 - Dezember 2013, 128 teststadt<br /> <hr class="hr1" /> <!--Ende--> <br /> </div> </div> </div> </body> </html>
-
Vielen Dank, jetzt klappt es auch mit dem Löschen der Zeilen
Zu dem Problem mit dem seltsamen Fehler bei FileWriteToLine: Das Problem lag offensichtlich and der AutoIt version 3.3.8.1. Ich habe jetzt aktualisiert und der Fehler tritt nicht mehr auf.
Seltsamerweise erhalte ich jetzt aber Fehler, wenn ich mein Script mit der Beta Version ausführe, die ich auch aktualisert habe. Mit der normalen Version geht alles
Das Script oben habe ich aktualisiert und ohne Leerzeichen im Austauschbaren Teil in der php Datei, funktioniert es dann auch.
-
Hi,
entweder hab ich grad nen Brett vorm Kopf oder ich komm einfach nicht auf die Lösung.
Eigentlich möchte ich nur in einem Script die _FileWriteToLine funktion nutzen, aber es klappt einfach nicht.
Ich habe die Funktion bereits in anderen Scripts erfolgreich verwendet, aber bei diesem komme ich nicht weiter.Was macht das Script: Es liest die Daten aus einer .php Datei in eine Liste, da kann man diese bearbeiten und die Funktion _writeData soll diese wieder in die Datei einfügen.
[autoit]
Ich habe mir mal eine MSG Box eingebaut, die mir @error, den Inhalt von $i und die Anzahl der Zeilen ausgibt.
@error ist 1, also: File has less lines than $iLine
$i ist 26 und die Zeilenzahl 54
Demnach verstehe ich das Problem jetzt nicht so ganz
Ich bin für jede Hilfe dankbar#include <File.au3>
[/autoit][autoit][/autoit][autoit]
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include "Forms\gui.isf"
; -- Created with ISN Form Studio 2 for ISN AutoIt Studio -- ;
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>
#include <ListViewConstants.au3>
#include <GuiListView.au3>
#include <FTPEx.au3>
Global $aArray
Global $start
Global $ende
$gui = GUICreate("Update Events",722,523,-1,-1,-1,-1)
$btn_hoch = GUICtrlCreateButton("Hoch",588,401,100,30,-1,-1)
$btn_runter = GUICtrlCreateButton("Runter",588,450,100,30,-1,-1)
Global $liste = GUICtrlCreatelistview("Titel |Text ",40,190,534,309,-1,512)
$inp_titel = GUICtrlCreateInput("",80,57,290,21,-1,512)
GUICtrlCreateLabel("Titel:",50,60,26,15,-1,-1)
GUICtrlSetBkColor(-1,"-2")
GUICtrlCreateLabel("Text:",50,100,24,15,-1,-1)
GUICtrlSetBkColor(-1,"-2")
GUICtrlSetStyle($liste, $LVS_REPORT, $LVS_EX_FULLROWSELECT)
$inp_text = GUICtrlCreateInput("",80,97,289,20,-1,512)
$btn_add = GUICtrlCreateButton("Hinzufügen",420,75,100,30,-1,-1)
$btn_upload = GUICtrlCreateButton("Upload",590,140,100,30,-1,-1)
$btn_del = GUICtrlCreateButton("Löschen",589,320,100,30,-1,-1)
GUISetState(@SW_SHOW,$gui)_importData ()
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $btn_add
GUICtrlCreateListViewItem(GUICtrlRead($inp_titel) & "|" & GUICtrlRead($inp_text), $liste)
Case $btn_del
_GUICtrlListView_DeleteItemsSelected($liste)
Case $btn_runter
_GUICtrlListView_MoveItems($liste,1)
Case $btn_hoch
_GUICtrlListView_MoveItems($liste,-1)
Case $btn_upload
_writeData ()EndSwitch
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
Sleep(10)
WEndFunc _importData()
[/autoit][autoit][/autoit][autoit]
_FileReadToArray(@ScriptDir& "\events.php", $aArray)
If @error Then
MsgBox(0, "", "Fehler beim einlesen der Datei. Fehler: " & @error)
Exit
EndIf
; Start und Ende finden
$start = _ArraySearch($aArray, "<!--Start-->",0, 0, 0, 1)
If @error Then
MsgBox(0, "", "Fehler beim der Suche nach dem Startpunk. Fehler: " & @error)
Exit
EndIf
$ende = _ArraySearch($aArray, "<!--Ende-->",0, 0, 0, 1)
If @error Then
MsgBox(0, "", "Fehler beim der Suche nach dem Endpunk. Fehler: " & @error)
Exit
EndIf
For $i = $start To $ende
If stringinstr($aArray[$i], '<p class="pcont2">') Then
$tmp = StringTrimLeft ($aArray[$i], 18)
$tmp = StringTrimRight($tmp, 10)
$tmp2 = StringTrimRight($aArray[$i+1], 6)
GUICtrlCreateListViewItem($tmp & "|" & $tmp2, $liste)
Endif
Next
EndFuncFunc _writeData ()
[/autoit][autoit][/autoit][autoit]
Local $asplit
Local $file2 = "events.php"
$delanzahl = ($ende) - ($start+1)
For $i = 1 to $delanzahl
_FileWriteToLine($file2, $start+1, "", 1)
If @error Then
MsgBox(0, "", "Fehler beim löschen der Zeilen in der Datei. Fehler: " & @error)
Exit
EndIf
Next
Local $itemc = _GUICtrlListView_GetItemCount ($liste)
$start2 = $start+1
For $i = 1 To $itemc
$tmp = _GUICtrlListView_GetItemTextString ($liste, $i-1)
$asplit = StringSplit($tmp, "|")
_FileWriteToLine($file2, $start2, '<p class="pcont2">' & $asplit[1] & '</p><br />', 0)
If @error Then
MsgBox(0, "", "Fehler beim schreiben in die Datei. Fehler: " & @error)
Exit
EndIf
$start2 +=1
_FileWriteToLine($file2, $start2, $asplit[2] & '<br />', 0)
If @error Then
MsgBox(0, "", "Fehler beim schreiben in die Datei. Fehler: " & @error)
Exit
EndIf
$start2 +=1
_FileWriteToLine($file2, $start2, '<hr class="hr1" /> ', 0)
If @error Then
MsgBox(0, "", "Fehler beim schreiben in die Datei. Fehler: " & @error)
Exit
EndIf
$start2 +=1
Next
EndFunc
;===============================================================================
; Function Name: _GUICtrlListView_MoveItems()
; Description: Moves Up or Down selected item(s) in ListView.
;
; Parameter(s): $hListView - ControlID or Handle of ListView control.
; $iDirection - Define in what direction item(s) will move:
; -1 - Move Up.
; 1 - Move Down.
;
; Requirement(s): AutoIt 3.3.0.0
;
; Return Value(s): On seccess - Move selected item(s) Up/Down and return 1.
; On failure - Return "" (empty string) and set @error as following:
; 1 - No selected item(s).
; 2 - $iDirection is wrong value (not 1 and not -1).
; 3 - Item(s) can not be moved, reached last/first item.
;
; Note(s): * If you select like 15-20 (or more) items, moving them can take a while (second or two).
;
; Author(s): G.Sandler a.k.a CreatoR
;===============================================================================
Func _GUICtrlListView_MoveItems($hListView, $iDirection)
Local $aSelected_Indices = _GUICtrlListView_GetSelectedIndices($hListView, 1)If UBound($aSelected_Indices) < 2 Then Return SetError(1, 0, "")
[/autoit][autoit][/autoit][autoit]
If $iDirection <> 1 And $iDirection <> -1 Then Return SetError(2, 0, "")Local $iTotal_Items = _GUICtrlListView_GetItemCount($hListView)
[/autoit][autoit][/autoit][autoit]
Local $iTotal_Columns = _GUICtrlListView_GetColumnCount($hListView)Local $iUbound = UBound($aSelected_Indices)-1, $iNum = 1, $iStep = 1
[/autoit][autoit][/autoit][autoit]Local $iCurrent_Index, $iUpDown_Index, $sCurrent_ItemText, $sUpDown_ItemText
[/autoit][autoit][/autoit][autoit]
Local $iCurrent_Index, $iCurrent_CheckedState, $iUpDown_CheckedState
Local $iImage_Current_Index, $iImage_UpDown_IndexIf ($iDirection = -1 And $aSelected_Indices[1] = 0) Or _
[/autoit][autoit][/autoit][autoit]
($iDirection = 1 And $aSelected_Indices[$iUbound] = $iTotal_Items-1) Then Return SetError(3, 0, "")ControlListView($hListView, "", "", "SelectClear")
[/autoit][autoit][/autoit][autoit]If $iDirection = 1 Then
[/autoit][autoit][/autoit][autoit]
$iNum = $iUbound
$iUbound = 1
$iStep = -1
EndIfFor $i = $iNum To $iUbound Step $iStep
[/autoit][autoit][/autoit][autoit]
$iCurrent_Index = $aSelected_Indices[$i]
$iUpDown_Index = $aSelected_Indices[$i]+1
If $iDirection = -1 Then $iUpDown_Index = $aSelected_Indices[$i]-1$iCurrent_CheckedState = _GUICtrlListView_GetItemChecked($hListView, $iCurrent_Index)
[/autoit][autoit][/autoit][autoit]
$iUpDown_CheckedState = _GUICtrlListView_GetItemChecked($hListView, $iUpDown_Index)_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index)
[/autoit][autoit][/autoit][autoit]For $j = 0 To $iTotal_Columns-1
[/autoit][autoit][/autoit][autoit]
$sCurrent_ItemText = _GUICtrlListView_GetItemText($hListView, $iCurrent_Index, $j)
$sUpDown_ItemText = _GUICtrlListView_GetItemText($hListView, $iUpDown_Index, $j)If _GUICtrlListView_GetImageList($hListView, 1) <> 0 Then
[/autoit][autoit][/autoit][autoit]
$iImage_Current_Index = _GUICtrlListView_GetItemImage($hListView, $iCurrent_Index, $j)
$iImage_UpDown_Index = _GUICtrlListView_GetItemImage($hListView, $iUpDown_Index, $j)_GUICtrlListView_SetItemImage($hListView, $iCurrent_Index, $iImage_UpDown_Index, $j)
[/autoit][autoit][/autoit][autoit]
_GUICtrlListView_SetItemImage($hListView, $iUpDown_Index, $iImage_Current_Index, $j)
EndIf_GUICtrlListView_SetItemText($hListView, $iUpDown_Index, $sCurrent_ItemText, $j)
[/autoit][autoit][/autoit][autoit]
_GUICtrlListView_SetItemText($hListView, $iCurrent_Index, $sUpDown_ItemText, $j)
Next_GUICtrlListView_SetItemChecked($hListView, $iUpDown_Index, $iCurrent_CheckedState)
[/autoit][autoit][/autoit][autoit]
_GUICtrlListView_SetItemChecked($hListView, $iCurrent_Index, $iUpDown_CheckedState)_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index, 0)
[/autoit][autoit][/autoit][autoit]
NextFor $i = 1 To UBound($aSelected_Indices)-1
[/autoit][autoit][/autoit][autoit]
$iUpDown_Index = $aSelected_Indices[$i]+1
If $iDirection = -1 Then $iUpDown_Index = $aSelected_Indices[$i]-1
_GUICtrlListView_SetItemSelected($hListView, $iUpDown_Index)
NextReturn 1
[/autoit]
EndFuncevents.php
PHP
Alles anzeigen<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="de" http-equiv="Content-Language" /> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>Test</title> <link href="style.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="wrapper"> <div id="header"> <? include ("head.php"); ?> </div> <div id="navi"> <? include ("nav.php"); ?> </div> <div id="content" align="center"> <? include ("head.php"); ?> <div id="content2" align="center"> <hr class="hr1" /> <!--Start--> <p class="pcont2">Testevent1</p><br /> von November 2013 - Dezember 2013, 123 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent2</p><br /> von November 2013 - Dezember 2013, 124 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent3</p><br /> von November 2013 - Dezember 2013, 125 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent4</p><br /> von November 2013 - Dezember 2013, 126 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent5</p><br /> von November 2013 - Dezember 2013, 127 teststadt<br /> <hr class="hr1" /> <p class="pcont2">Testevent6</p><br /> von November 2013 - Dezember 2013, 128 teststadt<br /> <hr class="hr1" /> <!--Ende--> <br /> </div> </div> </div> </body> </html>
-
Hi,
der Ordner wird schon erstellt, aber nicht im System32 Vezeichnis, denn bei 64bit Systemen werden die Pfade von 32bit Programmen in den syswow64 Ordner umgeleitet.
Die Lösung ist, dass Script als x64 zu kompilieren und schon funktioniert alles
Beim Ausführen im Editor, läuft dies übrigens als 32bit, also nicht gut um sowas zu testen. -
Also ohne es jetzt getestet zu haben, würde ich es mal so versuchen:
[autoit]$file = @ScriptDir & "\passwort.txt" ;// Optional Pfad + Name anpassen
[/autoit][autoit][/autoit][autoit]
$hFile = FileOpen($file, 2) ;// Datei im Schreibmodus öffnen (falls sie nicht exstiert, wird sie erstellt)
$checkpw = FileRead($hFile)
if $checkpw = "" then
$sText = InputBox("Passwort-Box", "Bitte geben Sie Ihr Passwort für ein und bestätigen Sie dieses mit 'OK'")
FileWrite($hFile, $sText) ;// Text in Datei schreiben
endif$sText = fileread($hFile)
[/autoit][autoit][/autoit][autoit]while 1
[/autoit]
if winexists("Authentifizierung") then
ControlSetText("Authentifizierung","","[CLASS:TkChild; INSTANCE:5]",$sText)
controlclick("Authentifizierung","","[CLASS:TkChild; INSTANCE:5]")
endif
sleep(100)
wend
FileClose($hFile) ;Sollte immer vorhanden sein
Exit ;Das auchEDIT: Kleine ergänzung
EDIT2: Ich seh gerade, dass deine ausgelesenen werte nicht ganz stimmen, die vom Input Feld ist sicher anders als der OK Knopf. -
Hi,
das 2. Problem bleibt!
Aber ich möchte hier schonmal einige Erkenntnisse mitteilen, die vieleicht dem einen oder anderem mit dem selben Problem, helfen könnten.
Ich habe jetzt etwas mit verschiedenen Dateitypen experimentiert.
Offenbar kann man mit der dsofile.dll so ziemlich alle Dateitypen bearbeiten.
Nachteil: Ändert man den Autor bei einem .txt File oder einer Avi Datei, wo es diesen ja gar nicht gibt, so kann das vom Explorer nicht angezeigt werden.
Vorteil: Der Wert ist aber trotzdem da, d.h. ich kann ihn mit einem Script auch wieder auslesen.Hier einmal die ein Beispiel an einer Avi Datei:
Wert setzen:
[autoit]; Object identifiers
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Global Const $sCLSID_OleDocumentProperties = "{58968145-CF05-4341-995F-2EE093F6ABA3}"
Global Const $IID_OleDocumentProperties = "{58968145-CF01-4341-995F-2EE093F6ABA3}"
Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")$sDll = "dsofile.dll" ; location and name of your dll
[/autoit][autoit][/autoit][autoit]
$hDll = DllOpen($sDll) ; open it; Experimenal feature. Try with newer versions of AutoIt
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$oFile = ObjCreate($sCLSID_OleDocumentProperties, $IID_OleDocumentProperties, $hDll)
If Not @error Then
;~ MsgBox(4096, "ObjCreate Test", "ObjCreate() of a DSO File Object successful !")
$oFile.Open("D:\ScreenRecords\Test.avi")
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.SummaryProperties.author = "Das ist ein Test Autor 124"
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Save
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Close
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
Else
MsgBox(4096, "ObjCreate Test", "Failed to create Object. Error code: " & Hex(@error, 8))
EndIf
DllClose ($hDll)
ExitFunc _ErrFunc($oError)
[/autoit]
ConsoleWrite("err.number is: " & @TAB & $oError.number & @CRLF & _
"err.windescription:" & @TAB & $oError.windescription & @CRLF & _
"err.description is: " & @TAB & $oError.description & @CRLF & _
"err.source is: " & @TAB & $oError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
"err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
"err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc ;==>_ErrFuncUnd so liest man es wieder aus:
[autoit]; Object identifiers
[/autoit][autoit][/autoit][autoit]
Global Const $sCLSID_OleDocumentProperties = "{58968145-CF05-4341-995F-2EE093F6ABA3}"
Global Const $IID_OleDocumentProperties = "{58968145-CF01-4341-995F-2EE093F6ABA3}"
Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
Dim $test$sDll = "dsofile.dll" ; location and name of your dll
[/autoit][autoit][/autoit][autoit]
$hDll = DllOpen($sDll) ; open it; Experimenal feature. Try with newer versions of AutoIt
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$oFile = ObjCreate($sCLSID_OleDocumentProperties, $IID_OleDocumentProperties, $hDll)
If Not @error Then
;~ MsgBox(4096, "ObjCreate Test", "ObjCreate() of a DSO File Object successful !")
$oFile.Open("D:\ScreenRecords\Test.avi")
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
MsgBox(0, "Test", $oFile.SummaryProperties.author)
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Close
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
Else
MsgBox(4096, "ObjCreate Test", "Failed to create Object. Error code: " & Hex(@error, 8))
EndIf
DllClose ($hDll)
ExitFunc _ErrFunc($oError)
[/autoit]
ConsoleWrite("err.number is: " & @TAB & $oError.number & @CRLF & _
"err.windescription:" & @TAB & $oError.windescription & @CRLF & _
"err.description is: " & @TAB & $oError.description & @CRLF & _
"err.source is: " & @TAB & $oError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
"err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
"err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc ;==>_ErrFunc -
Manchmal ist die Lösung ziemlich einfach...
Ich versuche es die ganze Zeit mit neu erstellten leeren Dokumenten...
Ein Buchstabe im Dokument reicht und schon funktioniert es auch mit .docx
Das 2. Problem besteht aber weiterhin. -
So,
nach einigem getüfftel habe ich rausgefunden woran es lag. Offenbar am docx Format.
Aber eigentlich sollte doch genau das damit gehen oder?Folgendes funktioniert wunderbar:
[autoit]
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
; Object identifiers
Global Const $sCLSID_OleDocumentProperties = "{58968145-CF05-4341-995F-2EE093F6ABA3}"
Global Const $IID_OleDocumentProperties = "{58968145-CF01-4341-995F-2EE093F6ABA3}"
Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")$sDll = "dsofile.dll" ; location and name of your dll
[/autoit][autoit][/autoit][autoit]
$hDll = DllOpen($sDll) ; open it; Experimenal feature. Try with newer versions of AutoIt
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$oFile = ObjCreate($sCLSID_OleDocumentProperties, $IID_OleDocumentProperties, $hDll)
If Not @error Then
;~ MsgBox(4096, "ObjCreate Test", "ObjCreate() of a DSO File Object successful !")
$oFile.Open("D:\neu.doc")
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.SummaryProperties.author = "Das ist ein Test Autor"
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Save
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Close
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
Else
MsgBox(4096, "ObjCreate Test", "Failed to create Object. Error code: " & Hex(@error, 8))
EndIf
DllClose ($hDll)
ExitFunc _ErrFunc($oError)
[/autoit]
ConsoleWrite("err.number is: " & @TAB & $oError.number & @CRLF & _
"err.windescription:" & @TAB & $oError.windescription & @CRLF & _
"err.description is: " & @TAB & $oError.description & @CRLF & _
"err.source is: " & @TAB & $oError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
"err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
"err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc ;==>_ErrFuncDamit bleiben aber leider einige Probleme offen:
1. Warum geht das nicht mit .docx (Ich habe irgendow in der Beschreibung von MS gelesen, dass das jetzt supported wird.Gelöst
2. Ich brauche die Funktion $oFile.CustomProperties.Add, kriege die aber nicht zum laufen. In C# würde man die wohl so aufrufen: oFile.CustomProperties.Add Test, WertKann da jemand weiter helfen?
Ich habe, die DLL jetzt mal angehängt, der Download von Microsoft ist ja doch etwas umständlich, weil da soviel anderer kram mit drinne ist.
-
Also ich verstehe die bisher gegebenen Infos so:
- DSOFile.dll gibt Dir die Möglichkeit Attribute von Office Dokumenten zu ändern auch wenn Office gar nicht installiert ist
- Wenn Office installiert ist, danna geht das auch mit Funktionen aus der Word UDF oder direkt über COM
- Mit DSOFile lassen sich Properties anderer Dateitypen nicht ändern
- Dazu gibt es garantiert eine Windows API
So ist es
Aber eine Windows API konnte ich dazu bisher noch nicht finden. Also wenn jemand mehr zu dem Thema weiss, ich bin für jede Hilfe dankbar -
...ist es Dein Ziel die Dokumenteneigenschaften einer .docx (Word) Datei auszulesen bzw zu setzen?
Dann empfehle ich Dir das Word-UDF und darin die Funktion _WordDocPropertyGet bzw. _WordDocPropertySet (Auszug aus der Hilfe im Spoiler)
Deine og. Fehlermeldungen würde ich dahingehend interpretieren, dass die DLL keine Worddateien verarbeiten kann.
Spoiler anzeigen
Funktionsreferenz--------------------------------------------------------------------------------
_WordDocPropertyGet
Gibt eine ausgewählte Eigenschaft der Word-Datei zurück.#include
_WordDocPropertyGet(ByRef $o_object, $v_property)Parameter
$o_object Objektvariable eines Word.Application Dokumentobjekts.
$v_property gewählte Eigenschaft (siehe Bemerkungen)Rückgabewert
Erfolg: Wert der ausgewählten Eigenschaft
Fehler: Gibt 0 zurück und setzt @ERROR
@Error: $_WordStatus_Success = Kein Fehler
$_WordStatus_GeneralError = allgemeiner Fehler
$_WordStatus_ComError = Com Fehler
$_WordStatus_InvalidDataType = ungültiger Datentyp
$_WordStatus_InvalidObjectType = ungültiger Objekttyp
$_WordStatus_InvalidValue = ungültiger Wert
@Extended: Nummer des ungültigen ParametersBemerkungen
Man kann entweder den Index oder Namen für die Auswahl der Eigenschaft verwenden.Die folgenden Tabellen zeigen eine Beschreibung für jede verfügbare Eigenschaft.
Word Dokument Eigenschaften
Index der Eigenschaft/Name Beschreibung
(1) "title" Titel.
(2) "subject" Thema.
(3) "author" Autor.
(4) "keywords" Stichwörter.
(5) "comments" Kommentare.
(6) "template" Name der Vorlage.
(7) "last author" Letzter Autor.
(8 ) "revision number" Anzahl der Überarbeitungen.
(9) "application name" Name der Anwendung.
(10) "last print date" letztes Druckdatum.
(11) "creation date" Erstelldatum.
(12) "last save time" zuletzt gespeichert am.
(13) "total editing time" Anzahl von Änderungen im VBA Pojekt.
(14) "pages" Anzahl Seiten.
(15) "words" Anzahl Wörter.
(16) "characters" Anzahl Zeichen.
(17) "security" Sicherheitseinstellungen.
(18 ) "category" Kategorie.
(19) "" nicht unterstützt.
(20) "manager" Manager.
(21) "company" Firma.
(22) "bytes" Anzahl Bytes.
(23) "lines" Anzahl Zeilen.
(24) "paragraphs" Anzahl Absätze.
(25-28 ) "" nicht unterstützt.
(29) "hyperlink base" Wenn ein relativer Link auf einem festgelegten Pfad basiert (der erste Teil des Pfades der Datei, der den Hyperlink und die Zieldatei enthält), ist der Pfad die Basis des Hyperlinks.
(30) "characters (with spaces)" Anzahl Zeichen inkl. Leerzeichen.Verwandte Funktionen
_WordDocPropertySet
Beispiel; *******************************************************
; Beispiel 1 - Erstellt ein Word-Fenster, öffnet ein Dokument
; und liest alle verfügbaren Dokumenteigenschaften durch den Index.
; *******************************************************
;
#includeLocal $oWordApp = _WordCreate(@ScriptDir & "\Test.doc")
Local $oDoc = _WordDocGetCollection($oWordApp, 0)
For $i = 1 To 30
ConsoleWrite("Index der Eigenschaft " & $i & " - " & _WordDocPropertyGet($oDoc, $i) & @CR)
Next; *******************************************************
; Beispiel 2 - Erstellt ein Word-Fenster, öffnet ein Dokument
; und liest den Titel, Betreff und Autor des Dokumentes durch den Namen aus.
; *******************************************************
;
#include
$oWordApp = _WordCreate(@ScriptDir & "\Test.doc")
$oDoc = _WordDocGetCollection($oWordApp, 0)
ConsoleWrite("Titel - " & _WordDocPropertyGet($oDoc, "Title") & @CRLF)
ConsoleWrite("Betreff - " & _WordDocPropertyGet($oDoc, "Subject") & @CRLF)
ConsoleWrite("Autor - " & _WordDocPropertyGet($oDoc, "Author") & @CRLF)
Grundsätzlich suche ich eine möglichkeit den kommentar bei so ziemlich jedem Dateityp zu setzen odert alternativ wenn das nicht geht eine eigene Eigenschaft hinzuzufügen.
Diese DLL soll das zumindest schonmal bei allen Office dokumenten ermöglichen, was ja schonmal ganz gut ist. Eventuell kann man damit sogar alle Dateitypen bearbeiten.
.docx kann die DLL laut Microsoft. Ich weiss das, dass Objekt erfolgreich erstellt wird, nur der Code danach verursacht Fehler...Gibt es vieleicht irgendeine Standard Funktion, die das auch kann? Ansonsten, weiss jemand, was hier nicht funktioniert?
-
UEZ: Ich denke, das hat er bereits auch gelesen, denn ich glaube dass Neklor hier im Forum Matrix112 im englischen Forum ist
trancexx hat uns da wohl einiges verschwiegen, was sie da in ObjCreate() eingebaut hat (3.Parameter = $hDLL ?) Schade, dass sie nicht mehr im Dev-Team ist.
Ja so ist es
Ich habe das bereits getestet, funktioniert anscheinend.
Ich habe jetzt aber mit den COM Abfragen ein neues Problem, dafür habe ich aber einen neuen Thread geöffnet. -
Hi,
ich habe ein Problem bei einer COM Abfrage.
Ich versuche zu einer Datei einen Kommentar hinzuzufügen, aber ich bekomme schon beim öffnen ein Problem.
Ich habe nicht sehr viel ahnung von COM, daher habe ich mich an ein VB Script gehalten und habe versucht das in AutoIt zu übersetzen.VB Script:
CodeSet oFile = CreateObject("DSOFile.OleDocumentProperties") oFile.Open("c:\tmp\test.txt") oFile.SummaryProperties.Comments = "Test Comment" oFile.Save oFile.Close
Mein Script:
[autoit]
[/autoit][autoit][/autoit][autoit]
Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")$oFile = ObjCreate("DSOFile.OleDocumentProperties")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
If Not @error Then
;~ MsgBox(4096, "ObjCreate Test", "ObjCreate() of a DSO File Object successful !")
$oFile.Open("C:\neu.docx")
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.SummaryProperties.Comments = "Test Kommentar"
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Save
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Close
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
Else
MsgBox(4096, "ObjCreate Test", "Failed to create Object. Error code: " & Hex(@error, 8))
EndIf
ExitFunc _ErrFunc($oError)
[/autoit]
ConsoleWrite("err.number is: " & @TAB & $oError.number & @CRLF & _
"err.windescription:" & @TAB & $oError.windescription & @CRLF & _
"err.description is: " & @TAB & $oError.description & @CRLF & _
"err.source is: " & @TAB & $oError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
"err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
"err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc ;==>_ErrFuncIch bekomme immer schon beim oFile.Open einen Fehler rausgeworfen:
err.number is: -2147352567
err.windescription: Unbekannter Fehler
err.description is:
err.source is: Dsofile.dll
err.helpfile is:
err.helpcontext is: 0
err.lastdllerror is: 0
err.scriptline is: 19
err.retcode is: -2147467259Weiss jemand was ich falsch mache?
Hinweis: Man benötigt Dsofile.dll von Microsoft, welche dann per regsvr32 registriert werden muss. http://support.microsoft.com/kb/224351/EN-US
EDIT:
Ich habe jetzt nochmal getestet ob es eventuell an der registrierten DLL liegt und habe eine alternative Methode probiert ohne die DLL zu registrieren, führt aber zum selben fehler, also liegt es vermutlich an meinem Code.Alternative Methode:
[autoit]
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
; Object identifiers
Global Const $sCLSID_OleDocumentProperties = "{58968145-CF05-4341-995F-2EE093F6ABA3}"
Global Const $IID_OleDocumentProperties = "{58968145-CF01-4341-995F-2EE093F6ABA3}"
Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")$sDll = "dsofile.dll" ; location and name of your dll
[/autoit][autoit][/autoit][autoit]
$hDll = DllOpen($sDll) ; open it; Experimenal feature. Try with newer versions of AutoIt
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$oFile = ObjCreate($sCLSID_OleDocumentProperties, $IID_OleDocumentProperties, $hDll)
If Not @error Then
;~ MsgBox(4096, "ObjCreate Test", "ObjCreate() of a DSO File Object successful !")
$oFile.Open("C:\neu.docx")
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.SummaryProperties.Comments = "Test Kommentar"
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Save
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
$oFile.Close
If @error Then MsgBox(48 + 262144, "COM Error", "@error is set to COM error number." & @CRLF & "@error = " & @error)
Else
MsgBox(4096, "ObjCreate Test", "Failed to create Object. Error code: " & Hex(@error, 8))
EndIf
DllClose ($hDll)
ExitFunc _ErrFunc($oError)
[/autoit]
ConsoleWrite("err.number is: " & @TAB & $oError.number & @CRLF & _
"err.windescription:" & @TAB & $oError.windescription & @CRLF & _
"err.description is: " & @TAB & $oError.description & @CRLF & _
"err.source is: " & @TAB & $oError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
"err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
"err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc ;==>_ErrFunc