Jump to content

All Activity

This stream auto-updates

  1. Past hour
  2. Hi folks 👋 , please consider to take part on the WebDriver poll which is regarding which driver do you automate. Please have a quick look here and take part ==> this could help us to improve or harden the WebDriver project in the future 😇 . Thanks, best regards Sven @Mugaro
  3. Hi folks 👋 , please consider to take part on the WebDriver poll which is regarding which driver do you automate. Please have a quick look here and take part ==> this could help us to improve or harden the WebDriver project in the future 😇 . Thanks, best regards Sven @SlavaS
  4. Hi Andi ( @agivx3 ), after a research I realized that there is no API request (no POST) available for https://www.catalog.update.microsoft.com/DownloadDialog.aspx anymore. If this is the case, then you cannot download the found windows update *.msu packages. Are you sure the powershell script loads the 4 found entries? Not for me and when I debug the PS script, I see it cannot work (at least not in that way which was provided by you in this post). What do you want exactly? Please describe the bigger goal behind all of this? Is it to download the newest cumulative updates for a specific maschine and that's it? If yes, then your possibilities to achieve this are less then thought before. You can try UIA or WebDriver to get this automation done. But please, write some code and try something to show your participation. I won't write it all for you 🧐 . Best regards Sven Question: Do you speak german by any chance? Update: This looks promising ==> https://github.com/ryan-jan/MSCatalog 😁 ==> but it's still Powershell
  5. Today
  6. Built-in update feature for ISN Autoit studio not working. I click "check for updates" in the main menu, the application detects there is a more up-to-date version available, the program exits to "apply the update," and I am immediately met with this: Process terminates, and re-launching ISN autoit studio shows that update has not been installed. Just a heads up.
  7. Glad you have mastered it much better that others ... and of course sharing your "master piece" in our examples forum. Thanks for that!
  8. When you copy things, the clipboard stores data and allows reading it under multiple formats. Simple ClipPut is likely to paste only ANSI text, while you need Unicode. ; For your information only Func EnumFormats() _ClipBoard_Open(0) Local $f, $n = _ClipBoard_CountFormats() ConsoleWrite($n & " clipboard formats are available:" & @LF) Do $f = _ClipBoard_EnumFormats($f) If $f > 0 Then ConsoleWrite("Format " & $f & " = " & _ClipBoard_FormatStr($f) & @LF) Until $f = 0 _ClipBoard_Close() EndFunc You probably need something like that: $sText = ReadUnicodeClip() ; paste or process read data where required ; .../... Func ReadUnicodeClip() _ClipBoard_Open(0) Local $f, $s Do $f = _ClipBoard_EnumFormats($f) Until _ClipBoard_FormatStr($f) = "Unicode Text" $s = _ClipBoard_GetData($f) _ClipBoard_Close() Return $s EndFunc Format numbers change depending on context, so don't rely on magic numbers and always scan formats until the one you need is found.
  9. FYI: I solved it by forcing transpose $aSongs = _Excel_RangeRead($oWorkbook, $wsName, $cellRange, default, True)
  10. Well, I tried to delete the above post - but I can't. SO - here is another one. In this I changed the file name from DDW.au3 to WinDD.au3. I did this because I realized most (if not all) Windows based functions start with "Win" or "_Win". So I changed it to WinDD. Anyway, Here it is: #cs     Copyright (c) 2020 TarreTarreTarre <tarre.islam@gmail.com>     Permission is hereby granted, free of charge, to any person obtaining a copy     of this software and associated documentation files (the "Software"), to deal     in the Software without restriction, including without limitation the rights     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell     copies of the Software, and to permit persons to whom the Software is     furnished to do so, subject to the following conditions:     The above copyright notice and this permission notice shall be included in all     copies or substantial portions of the Software.     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE     SOFTWARE. #ce #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7 #include-once ; #FUNCTION# ========================================================================================================= ; Name ..........: WinDD ; Description ...: Displays useful information about a variable or object in the console ; Syntax ........: WinDD($any[, $exit = True], $timeout=0) ; Parameters ....: $any                 - anything. ;                  $exit                - [optional] an boolean value. Default is True. ; Return values .: None ; Author ........: TarreTarreTarre and Mark Manning (only made changes) ; Modified ......: May 9, 2024 ; Remarks .......: Made it so this works for MsgBox ; Related .......: ; Link ..........: ; Example .......: No ; =================================================================================================================== Global $__WinDD_String = ""; Func WinDD($any, $exit = True, $timeout=0)    ;    0 = YOU have to close the dialog     $__WinDD_String = @crlf & "--->Starting Debug" & @crlf & @crlf;     __WinDD($any, 0)     $__WinDD_String &= @crlf & "<---Exiting Debug" & @crlf;     MsgBox( $MB_SYSTEMMODAL, "WinDD Debug Information", $__WinDD_String, $timeout );     If $exit Then Exit EndFunc   ;==>WinDD #Region Internals Func __WinDD($any, $depth)     Switch VarGetType($any)         Case "Array"             __WinDD_Array($any, $depth)         Case "Object" And ObjName($any) == "Dictionary"             $__WinDD_String &= "- ";             __WinDD_ScriptingDictionary($any, $depth)         Case Else             $__WinDD_String &= (IsObj($any) ? '! ' : '> ');             __WinDD_Other($any)     EndSwitch EndFunc   ;==>__WinDD Func __WinDD_Array($array, $depth, $curI = Null, $curJ = Null, $ignoreTabs = False)     Local Const $rows = UBound($array)     Local Const $cols = UBound($array, 2)     Local $cur, $oInfo, $cwColor     If $cols == 0 Then         $curI = VarGetType($curI) == "Int32" ? StringFormat("[%d] => ", $curI) : ""         $__WinDD_String &= _             (">" & __GetTabs($depth, $ignoreTabs) & StringFormat('%s(Array:%d) [', $curI, $rows) & @LF);         For $i = 0 To $rows - 1             $cur = $array[$i]             $oInfo = __GetDataInfo($cur)             $cwColor = IsObj($cur) ? (ObjName($cur) == "Dictionary" ? '-' : '!') : '>'             If IsArray($cur) Then                 __WinDD_Array($cur, $depth + 1, $i) ;                $__WinDD_String &= ("> " & $sTabs & "]" & @LF);             ElseIf IsObj($cur) And ObjName($cur) == "Dictionary" Then                 $__WinDD_String &= ("- " & __GetTabs($depth + 1) & StringFormat('[%d] => ', $i));                 __WinDD_ScriptingDictionary($cur, $depth + 1, True)             Else                 $__WinDD_String &= ($cwColor & " " & __GetTabs($depth + 1) & _                     StringFormat('[%d] (%s:%s) => "%s"', $i, $oInfo.item("type"), _                     $oInfo.item("length"), $oInfo.item("value")) & @LF);             EndIf         Next     Else         $curI = VarGetType($curI) == "Int32" ? ($depth == 1 ? StringFormat("[%d] => ", $curI) : StringFormat("[%d][%d] => ", $curI, $curJ)) : ""         $__WinDD_String &= (">" & __GetTabs($depth, $ignoreTabs) & _             StringFormat('%s(Array:%d:%d) [', $curI, $rows, $cols) & @LF);         For $i = 0 To $rows - 1             For $j = 0 To $cols - 1                 $cur = $array[$i][$j]                 $oInfo = __GetDataInfo($cur)                 $cwColor = IsObj($cur) ? (ObjName($cur) == "Dictionary" ? '-' : '!') : '>'                 If IsArray($cur) Then                     __WinDD_Array($cur, $depth + 1, $i, $j)                 ElseIf IsObj($cur) And ObjName($cur) == "Dictionary" Then                     $__WinDD_String &= ("- " & __GetTabs($depth + 1) & _                         StringFormat('[%d][%d] => ', $i, $j));                     __WinDD_ScriptingDictionary($cur, $depth + 1, True)                 Else                     $__WinDD_String &= ($cwColor & " " & __GetTabs($depth + 1) & _                         StringFormat('[%d][%d] (%s:%s) => "%s"', $i, $j, $oInfo.item("type"), _                         $oInfo.item("length"), $oInfo.item("value")) & @LF);                 EndIf             Next         Next     EndIf     $__WinDD_String &= ("> " & __GetTabs($depth) & "]" & @LF); EndFunc   ;==>__WinDD_Array Func __WinDD_ScriptingDictionary($object, $depth, $ignoreTabs = False)     $__WinDD_String &= (__GetTabs($depth, $ignoreTabs) & _         StringFormat('(Scripting.Dictionary:%d) {', $object.count()) & @LF), 5 );     For $item In $object         Local $key = $item         Local $value = $object.item($key)         Local $oInfo = __GetDataInfo($value)         If IsObj($value) And ObjName($value) == "Dictionary" Then             $__WinDD_String &= (StringFormat("- " & __GetTabs($depth + 1) & "[%s] => ", $key));             __WinDD_ScriptingDictionary($value, $depth + 1, True)         ElseIf IsArray($value) Then             $__WinDD_String &= ("> " & __GetTabs($depth + 1) & StringFormat('[%s] => ', $key));             __WinDD_Array($value, $depth + 1, Null, Null, True)         Else             $__WinDD_String &= ("- " & __GetTabs($depth + 1) & _                 StringFormat('[%s] (%s:%s) => "%s"', $key, $oInfo.item("type"), _                 $oInfo.item("length"), $oInfo.item("value")) & @LF);         EndIf     Next     $__WinDD_String &= ("- " & __GetTabs($depth) & "}" & @LF); EndFunc   ;==>__WinDD_ScriptingDictionary Func __WinDD_Other($any)     Local Const $oInfo = __GetDataInfo($any)       $__WinDD_String &= (StringFormat('(%s:%s) "%s"', $oInfo.item("type"), _         $oInfo.item("length"), $oInfo.item("value")) & @LF); EndFunc   ;==>__WinDD_Other Func __GetDataInfo($any)     Local Const $oRet = ObjCreate("Scripting.Dictionary")     Local $type = VarGetType($any)     Local $value = $any     Local $length = StringLen($any)     Switch $type         Case "UserFunction"             ContinueCase         Case "Function"             $value = FuncName($any)             $length = StringLen($value)         Case "Object"             $type = ObjName($any)             $length = ObjName($any, 2) ; Descriptobn             $value = ObjName($any, 6) ; Clisid         Case "String"             Local $str = $any             $str = StringReplace($str, @LF, "\LF")             $str = StringReplace($str, @CR, "\CR")             $str = StringReplace($str, @CRLF, "\CRLF")             $str = StringReplace($str, @TAB, "\TAB")             $value = $str         Case "Binary"             $value = BinaryLen($any)         Case "Keyword" And $length == 0             $value = "NULL"     EndSwitch     $oRet.add("type", $type)     $oRet.add("length", $length)     $oRet.add("value", $value)     Return $oRet EndFunc   ;==>__GetDataInfo Func __GetTabs($depth, $ignoreTabs = False)     If $ignoreTabs Then Return ""     Local $sTabs     For $i = 0 To $depth - 1         $sTabs &= "    " ; @TAB     Next     Return $sTabs EndFunc   ;==>__GetTabs #EndRegion Internals Same filename though but that's because it is inside of the directory. Autoit-DD-1.1.0.zip
  11. Hmmm... I'm specifying range "A1:P555" which is only about 5000 cells. I'm still getting this error. FYI: @extended = "-2147352571"
  12. @jchd hello ! Your knowledge in translation & encoding is required I would like to translate this Russian sentence in english : а если подумать 1) If I do it from my Opera Browser, using Google translation service, it works fine : Complete Opera URL is : https://www.google.com/search?tlsa=1&sca_esv=f42f57a008774f06&sca_upv=1&gbv=2&ei=DSM-ZtX0BvaRxc8P74iQqA8&q=Traduire&tlitesl=ru&tlitetxt=%D0%B0+%D0%B5%D1%81%D0%BB%D0%B8+%D0%BF%D0%BE%D0%B4%D1%83%D0%BC%D0%B0%D1%82%D1%8C&tlitetl=en We can extract from the URL the russian text that has been correctly translated : %D0%B0+%D0%B5%D1%81%D0%BB%D0%B8+%D0%BF%D0%BE%D0%B4%D1%83%D0%BC%D0%B0%D1%82%D1%8C 2) Now I try to do same with the AutoIt script from my preceding post (the one that uses Google API and JSON.au3), with this change made before : ;======================== Local $sLangFROM = "ru" Local $sLangTO = "en" ;======================== Then we copy to the clipboard the original russian sentence (select it, then ctrl+c) and we run the script, this is the "wrong" result displayed in the Console & MessageBox : 3) If I replace the $sUrl line in the script, not using $sMytext anymore, but replacing it with the literal russian text extracted from Opera URL : ; $sUrl = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=" & $sFrom & "&tl=" & $sTo & "&dt=t&q=" & $sMytext $sUrl = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=" & $sFrom & "&tl=" & $sTo & "&dt=t&q=" & _ "%D0%B0+%D0%B5%D1%81%D0%BB%D0%B8+%D0%BF%D0%BE%D0%B4%D1%83%D0%BC%D0%B0%D1%82%D1%8C" Now the translation is correct. So I got this issue with original russian text, but not with original german, spanish, turkish, english, french (etc...) languages. Do you have an idea why it happens and how could it be solved ? Because the preceding script is really useful, you can create a shortcut of the script on the Desktop and as soon as you got foreign sentence(s) to translate, a simple click on the shortcut should do it (with of course : Local $sLangFROM = "auto" in the script) Thanks for reading
  13. The examples of use of the CDO Message object present on the forum generally show a standard use of the CDO object. Which implies the lack of mastery of everything that this object is capable of accomplishing. In my udf which is above all informative, you clearly see each step of using this object. Moreover, you can easily integrate it into your applications. The specialty of my udf is its modularity and robustness.
  14. Here is an easy way to add menu items to the system menu. This code is useable only on 1 window (once per script). The Example is at the end: sysmenu_include.au3 #include-once ;# Example code is at the end ; modified code from https://www.autoitscript.com/forum/topic/119546-how-to-handle-sys-menu-button-click/?do=findComment&comment=830763 ; SysMenu Include ; Commands: SysmenuInitialize(GuiHandle) - Initializes the system menu handling. Only 1 window is supported (It is useable only once) ; Sysmenu_AddSeparator() - Adds an separator item to the sysmenue ; SysMenu_AddItem("menu name") - Adds an System menu item, returns the created menu number ; Sysmenu_GetSelectedMenuItem() use it in the main loop to get the selected menu item number ; supported menu numbers are starting from 1 to max 30 ; Returns 0 if no menu was selected #include <WinAPIConv.au3> #include <WindowsConstants.au3> #include <GuiMenu.au3> #include <MenuConstants.au3> Global $v__SysMenuInitialise = 0, $h__SystemMenu, $v__SysMenuSelection = "" ;_GUICtrlMenu_GetItemCount($h__SystemMenu) Func SysmenuInitialize($h__sysmenuGUI) If $v__SysMenuInitialise = 0 Then Global $a__sysmenuarray[31][2] $a__sysmenuarray[0][0] = 0 $a__sysmenuarray[0][1] = 12288 $h__SystemMenu = _GUICtrlMenu_GetSystemMenu($h__sysmenuGUI) GUIRegisterMsg($WM_SYSCOMMAND, "_WM_SYSMCOMMAND") $v__SysMenuInitialise = 1 EndIf EndFunc ;==>SysmenuInitialize Func Sysmenu_AddSeparator() If $v__SysMenuInitialise = 1 Then _GUICtrlMenu_AppendMenu($h__SystemMenu, $MF_SEPARATOR, 0, "") EndFunc ;==>Sysmenu_AddSeparator Func SysMenu_AddItem($v__SystemMenuItemName = "") If $v__SysMenuInitialise = 1 Then If $a__sysmenuarray[0][0] <= 30 Then $a__sysmenuarray[0][0] = $a__sysmenuarray[0][0] + 1 $a__sysmenuarray[0][1] = $a__sysmenuarray[0][1] + 1 $tmp = $a__sysmenuarray[0][0] $tmp1 = $a__sysmenuarray[0][1] $a__sysmenuarray[$tmp][0] = $v__SystemMenuItemName $a__sysmenuarray[$tmp][1] = $tmp1 ;_GUICtrlMenu_AppendMenu($hSystemMenu, $MF_STRING, 0x3000, "About") ; You need to set the CmdID value here _GUICtrlMenu_AppendMenu($h__SystemMenu, $MF_STRING, $tmp1, $a__sysmenuarray[$tmp][0]) ; You need to set the CmdID value here Return $a__sysmenuarray[0][0] EndIf EndIf EndFunc ;==>SysMenu_AddItem ;For $x = 6 To 0 Step -1 ; _GUICtrlMenu_DeleteMenu($h__SystemMenu, $x, True) ;Next Func Sysmenu_GetSelectedMenuItem() Local $tmp = 0 If $v__SysMenuInitialise = 1 Then If $v__SysMenuSelection <> 0 Then $tmp = $v__SysMenuSelection $v__SysMenuSelection = "" EndIf EndIf Return $tmp EndFunc ;==>Sysmenu_GetSelectedMenuItem Func _WM_SYSMCOMMAND($hGUI, $iMsg, $wParam, $lParam) Local $tmp = -1, $tmp1 = -1 If $v__SysMenuInitialise = 1 Then If $iMsg = $WM_SYSCOMMAND Then $tmp = _WinAPI_LoWord($wParam) For $x = 1 To $a__sysmenuarray[0][0] $tmp1 = $a__sysmenuarray[$x][1] If $tmp = $tmp1 and $tmp>0 Then $v__SysMenuSelection = $x ExitLoop EndIf Next EndIf EndIf EndFunc ;==>_WM_SYSCOMMAND ;EXAMPLE ********************************************************************************************************** ;~ #include <sysmenu_include.au3> ;~ #include <GUIConstantsEx.au3> ;~ ;Create a test gui ;~ $Form1 = GUICreate("Form1", 369, 192, 192, 124) ;~ GUISetState(@SW_SHOW) ;~ ;Initialize the system menu and add some menu items: ;~ SysmenuInitialize($Form1) ;Initialize the system menu with a handle to the gui ;~ if Random(0,1,1)=1 then Sysmenu_AddSeparator() ;Adds an optional separator ;~ $sm1=SysMenu_AddItem("Exit") ;Add an menu item ;~ for $x=2 to Random(2,5,1) ;~ SysMenu_AddItem($x & " Test") ;~ Next ;~ ;Handling example: ;~ While 1 ;~ $nmsg=GUIGetMsg() ;~ $tmp=Sysmenu_GetSelectedMenuItem() ;~ If $nmsg=$GUI_EVENT_CLOSE or $tmp=$sm1 then Exit ;~ if $tmp>0 then WinSetTitle ($Form1,"","Menu Clicked: " & $tmp & @CRLF) ;~ WEnd
  15. Sounds familiar .... pretty sure this was posted before many moons ago by somebody i know.
  16. Just have seen that with the json.udf compression of strings to json could be done ; Public Functions: ; Json_StringEncode($String, $Option = 0) ; Json_StringDecode($String) ; Json_IsObject(ByRef $Object) ; Json_IsNull(ByRef $Null) ; Json_Encode($Data, $Option = 0, $Indent = Default, $ArraySep = Default, $ObjectSep = Default, $ColonSep = Default) ; Json_Decode($Json, $InitTokenCount = 1000) ; Json_ObjCreate() ; Json_ObjPut(ByRef $Object, $Key, $Value) ; Json_ObjGet(ByRef $Object, $Key) ; Json_ObjDelete(ByRef $Object, $Key) ; Json_ObjExists(ByRef $Object, $Key) ; Json_ObjGetCount(ByRef $Object) ; Json_ObjGetKeys(ByRef $Object) ; Json_ObjGetItems(ByRef $Object) ; Json_ObjClear(ByRef $Object) ; Json_Put(ByRef $Var, $Notation, $Data, $CheckExists = False) ; Json_Get(ByRef $Var, $Notation) ; Json_Dump($String)
  17. Ease of use: This UDF greatly simplifies the process of sending emails using AutoIt. With clear methods and well-defined parameters, it makes email and SMTP server manipulation more accessible even for beginners in programming. Flexibility: The UDF offers significant flexibility by allowing the management of emails, attachments, recipients, message bodies, and even sensitivity options. This enables users to customize their emails according to their specific needs. Full support for SMTP features: By relying on standard SMTP technologies, this UDF ensures compatibility with most SMTP servers, providing a robust and reliable solution for email sending. Error handling: The integrated error handling in the UDF ensures a smooth user experience. Errors are identified and managed appropriately, facilitating debugging and application improvement. Comprehensive documentation: The UDF is accompanied by detailed documentation explaining each function, its parameters, and its returns. This makes integration and use of the UDF easier and more efficient. In addition, this UDF allows for meticulous manipulation of each step of the email sending process using the CDOMessage object. Users can finely control aspects such as authentication, server connection, message composition, and attachment handling, providing them with full control over their email operations. This level of granularity ensures that users can tailor their email functionality to suit their precise requirements, enhancing the overall versatility and utility of the UDF. CDOmail.rar
  18. Hi Sven, Great work ! I wouldnt have found the RegEx pattern myself but i understand how it works. So for my understanding - the first web request is nothing else than connecting to the website and then parsing the result ? With your script i now have understood how the first powershell commands parse the returned text. So far so good. I agree with you that the second part is the more difficult part. I see that the string $Post is build somehow with the information we already have or can extract. What i still dont unterstand is what is happing in the "convertTo-Json -Compress" and if there is a possibility in AutoIt for this. The second problem is the web request with the method "Post". I assume the inetget is not working for this. I think the winhttp.au3 can do this somehow but dont know howto. Analyzing the final download string i can see that we have only parts of the information needed to build it or get its information from the website. The bold text is missing or built somehow. Example: https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2024/04/windows10.0-kb5036909-x64_786040b0b0d000b17d6a727ea93ff77d733d1044.msu Best regards Andi
  19. Hi there. I don't exactly know whether this post of mine should be classified as a "suggestion" or "help-request" 😀 Maybe s'thing in between. I hoped i could use " _WD_ExecuteCDPCommand" to call the cdp command "Network.Headers" in order to retrieve the request/response headers of the page/tab currently opened in (and controlled by) a webdriver session (similar to what i usually do for cookies with "_WD_Cookies"). Unfortunately i saw that "Network.Headers" is listed as a "Type" (not as a "method") in the official cdp documentation linked in your post, so i'm currently unable to translate it into actual autoit code in order to perform a test. Here's my sample code Local $sCapabilities = "" If FileExists("geckodriver.exe") Then _WD_UpdateDriver('Firefox') $sCapabilities = Call(SetupGecko, False) ElseIf FileExists("chromedriver.exe") Then _WD_UpdateDriver('Chrome') $sCapabilities = Call(SetupChrome, False) ElseIf FileExists("msedgedriver.exe") Then _WD_UpdateDriver('MSEdge') $sCapabilities = Call(SetupEdge, False) ElseIf FileExists("operadriver.exe") Then _WD_UpdateDriver('Opera') $sCapabilities = Call(SetupOpera, False) EndIf If not StringIsSpace($sCapabilities) Then Local $iWebDriver_PID = _WD_Startup() Local $sSession = _WD_CreateSession($sCapabilities) _WD_Window($sSession, "Maximize") _WD_Navigate($sSession, "http://www.somesite.com") If MsgBox($MB_OKCANCEL + $MB_SYSTEMMODAL + $MB_TOPMOST, "Awaiting confirmation", "Please click <OK> as soon as navigation is completed") = $idOk Then ;retrieving session cookies Local $cCookiesJson = _WD_Cookies($sSession, "GETALL") ;retrieving session last response headers (currently i'm unable to do this) ????????? Endif _WD_DeleteSession($sSession) _WD_Shutdown($iWebDriver_PID) Endif Is that already possible? If not so, here's my implicit suggestion 😀 Ciao Franco P.S.: obviously it would not be a big deal even if should be possibile only on chrome
  20. How can I print bar codes (code 128) into a pdf? I use barcode128.au3 for generating the Code 128 string from my input string (patient name etc.) #include <barcode128.au3> ; Much thancs to Zedna for duing this work and sharing it. First of all I install the true type font code128.ttf with font name "Code 128" as a Win10 font. Next I include in the MPDFF_UDF.au3 V103 the missing function _Iif and get the Example_Mixed.au3 running. After this I tried to include the "Code 128" font: ; constant string as new font name: Global $PDF_FONT_CODE128 = "Code 128" ; setting the font name _LoadFontTT("_Code128", $PDF_FONT_CODE128) ; genrat test string: $stOut = "" For $i=32 To 64 $stOut = $stOut & Chr($i) Next ; start a pdf page as in the example: Example_Mixed.au3 and change pdf content to: _BeginPage() ;put some text etc. _SetColourFill(0x000000) _DrawText(3, 20, $stOut, "_Courier", 12, $PDF_ALIGN_LEFT, 0) _DrawText(3, 16, $stOut, "_Code128", 12, $PDF_ALIGN_LEFT, 0) _EndPage() But the result is always a ASCII Char Array: !"#$%&'()*+,-./0123456789:;<=>?@, not a series of bar code letters. How to install and use the font "Code 128" corectly to generate a pdf? My changes in MPDFF_UDF: ; include style etc., same parameter used as at function __FontCourier Func __FontCode128($Style = $PDF_FONT_NORMAL) $BaseFont = "Code 128" $FirstChar = 32 $LastChar = 255 $MissingWidth = 600 Local $aTemp[$LastChar - $FirstChar]; + 1] Switch $Style Case $PDF_FONT_NORMAL $aTemp = StringSplit("600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, " & _ "600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, " & _ "600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, " & _ "600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, " & _ "600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, " & _ "600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, " & _ "600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, " & _ "600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600", ", ", 3) $Param = "/Flags 34 /FontBBox [-250 -300 720 1000] " & _ "/MissingWidth 600 /StemV 109 " & _ "/StemH 109 /ItalicAngle 0 /CapHeight 833 /XHeight 417 " & _ "/Ascent 833 /Descent -300 /Leading 133 " & _ ;...the othet 2 cases are simelar EndSwitch For $i = $FirstChar To $LastChar $Widths[$i] = $aTemp[$i - $FirstChar] Next Local $aRetTmp[6] = [$BaseFont, $FirstChar, $LastChar, $Param, $Widths, $MissingWidth] Return $aRetTmp EndFunc ;==>__FontCode128 ; add the new case in _loadFont Func _LoadFontTT($sAlias, $BaseFont, $sOptions = $PDF_FONT_NORMAL) Local $sTemp = "" $_Font = $_Font + 1 $BaseFont = StringReplace($BaseFont, " ", "") Switch $BaseFont Case "TimesNewRoman" __FontTimes($sOptions) Case "CourierNew" __FontCourier($sOptions) Case "Code128" __FontCode128($sOptions) ; it this seem that this is not working corectly Case "Symbol" __FontSymbol($sOptions) Case "Calibri" __FontCalibri($sOptions) Case "Garamond" __FontGaramond($sOptions) Case Else __FontArial($sOptions) EndSwitch Local $i = __InitObj() __ToBuffer("<< /Type/Font/Subtype/TrueType/Name/" & $sAlias & "/BaseFont/" & $BaseFont & $sOptions & "/FirstChar " & $FirstChar & "/LastChar " & $LastChar & "/FontDescriptor " & $i + 1 & " 0 R/Encoding/WinAnsiEncoding/Widths [") For $j = $FirstChar To $LastChar If $Widths[$j - $FirstChar] <> 0 Then $sTemp &= __ToStr($Widths[$j - $FirstChar]) & " " If Mod($j - $FirstChar + 1, 16) = 0 Or $j = $LastChar Then __ToBuffer($sTemp) $sTemp = "" EndIf EndIf Next __ToBuffer("] >>") __EndObj() $_sFONT = $_sFONT & "/" & $sAlias & " " & $i & " 0 R " & @CRLF $_sFONTNAME = $_sFONTNAME & "<" & $sAlias & ">" & StringRight("0000" & $_Font, 4) & ";" ;$i = __InitObj() __ToBuffer("<< /Type/FontDescriptor/FontName/" & $BaseFont & $Param & ">>") __EndObj() EndFunc ;==>_LoadFontTT
  21. Here a little starting approach without WinHTTP.au3 for your list of IDs and Names for the server updates: #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 4 -w 5 -w 6 -w 7 #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y #include-once #include <Array.au3> _Main() Func _Main() Local Const $sTargetMaschine = '2024-04 21H2 Server' Local Const $sUrlMsUpdateCatalog = 'https://www.catalog.update.microsoft.com/Search.aspx?q=' & $sTargetMaschine Local Const $sFile = 'result.html' ; In your case, you can simply get the information by InetGet() instead of using WinHTTP.au3. ; When it comes to auth., I recommend WinHTTP.au3. InetGet($sUrlMsUpdateCatalog, $sFile) Local Const $sContent = _GetFileContent($sFile) Local Const $aList = _GetListOfIdsAndNames($sContent) _ArrayDisplay($aList) EndFunc Func _GetListOfIdsAndNames($sContent) Local Const $sRegExPattern = '(?s)onclick=''goToDetails\("(.+?)".+?>(.+?)</a>' Local $aListOfIdsAndNames = StringRegExp($sContent, $sRegExPattern, 3) Local Const $iLeadingTrainlingDoubleFlag = 7 For $i = 0 To _Length($aListOfIdsAndNames) $aListOfIdsAndNames[$i] = StringStripWS($aListOfIdsAndNames[$i], $iLeadingTrainlingDoubleFlag) Next Return $aListOfIdsAndNames EndFunc Func _GetFileContent($sFile) Local Const $iUtf8WithoutBomMode = 256 Local $hFile = FileOpen($sFile, $iUtf8WithoutBomMode) Local $sFileContent = FileRead($hFile) FileClose($hFile) Return $sFileContent EndFunc Func _Length($aList) Return UBound($aList) - 1 EndFunc For the second request, the POST request, you would probably need another approach. But it's only a start - there are several ways to do it. I personally would use WebDriver (au3WebDriver), but this could be way over the top (regarding the setup) for you needs. Best regards Sven
  22. Understood, totally agree with that 😅 . Me neither, but only thought it is urgent for you. That's why I suggested to stick with PS. I guess the AutoIt script will become a bit longer then the PS, but where are you struggling exactly? First you do you http request (with WinHTTP.au3 like @water already suggested), then you do the parsing stuff like in the PS code. Let's give it a try. I strongly believe we can help you through the steps, but please try first 🤝 . Best regards Sven
  23. @Musashi It's been a long time Thanks for this interesting script you provided above in this thread, which translates nicely from one language to another, using Google api & Json.au3 (by @AspirinJunkie) I got a problem when there are end of lines inside the original text (@crlf or @cr or @lf) as they are all lost inside the translated text. For example, with this original german text (which will be translated to english) Global $sRead1 = "Hallo. Wie geht's dir?" & @crlf & "Gut, danke." If I understand correctly, this is what the script does actually, depending on this line : $sOutput &= ($aData[$i])[0] ; & @CRLF or $sOutput &= ($aData[$i])[0] & @CRLF In the 1st case, the english output will be a single line : Hello. How are you?Good, thank you. In the 2nd case, it will become 2 lines (because a dot followed by a space has been found ?) Hello. How are you?Good, thank you. Both preceding outputs aren't really satisfying. What I would like is the following output, where the original EOL's are found at the same place in the translated text : So I tried a workaround in the script below and it seems to work. I'm keeping all commented lines in it, in case someone is interested in them. To run the script : * copy to the clipboard (ctrl+c) any german (or spanish, french etc...) text containing some end of lines, for example this german text : Hallo. Wie geht's dir? Gut, Danke. * then run the following script, which should translate to english (due to the line : Local $sLangTO = "en") * If you run the script from Scite, you'll have the translated text in the Console & MsgBox * If not run from Scite, it will be translated in MsgBox only. If you guys have some ideas to improve this, please indicate them here, thanks. #include "Json.au3" ; (by @AspirinJunkie) ;======================== Local $sLangFROM = "auto" Local $sLangTO = "en" ; <===== change this line for the language of the translated text ;======================== ; Local $sClipGet = ClipGet() ; Local $sClipGet = StringReplace(ClipGet(), @crlf, Chr(255)) ; personal solution to prevent loss of eventual @crlf in translated text Local $sClipGet = StringRegExpReplace(ClipGet(), "\R", Chr(255)) ; ditto ; ConsoleWrite("ORIGINAL: " & $sClipGet & @CRLF) ; ConsoleWrite("ORIGINAL: " & ClipGet() & @CRLF) ConsoleWrite("ORIGINAL: " & BinaryToString(StringToBinary(ClipGet(), 4), 1) & @CRLF) ConsoleWrite("--------------------------------------------------------------------------------------------------------------------" & @CRLF) Local $sTranslated = _GoogleAPITranslate($sClipGet, $sLangFROM, $sLangTO) ; ConsoleWrite($sTranslated & @CRLF) ; bad pour caractères accentués français dans la console ; https://www.autoitscript.com/forum/topic/181796-consolewrite-only-outputting-asciiansi/?do=findComment&comment=1305566 ConsoleWrite(BinaryToString(StringToBinary($sTranslated, 4), 1) & @CRLF) ; jchd syntax ok pour caractères accentués français dans la console MsgBox(262144, "Translated From " & $sLangFROM & " To " & $sLangTO, $sTranslated) ; $MB_TOPMOST = 262144 ;============================================== Func _GoogleAPITranslate($sMytext, $sFrom, $sTo) Local $sUrl, $oHTTP, $sResponse, $JSONData, $sOutput = "", $aData $sUrl = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=" & $sFrom & "&tl=" & $sTo & "&dt=t&q=" & $sMytext $oHTTP = ObjCreate("Microsoft.XMLHTTP") $oHTTP.Open("POST", $sUrl, False) $oHTTP.Send() $sResponse = $oHTTP.ResponseText $JSONData = _JSON_Parse($sResponse) If VarGetType($JSONData) = 'Array' Then $aData = $JSONData[0] If VarGetType($aData) = 'Array' Then For $i = 0 To UBound($aData) -1 ; Original script line with commented @CRLF (all translated text will become a single line) ; $sOutput &= ($aData[$i])[0] ; & @CRLF ; Original script line with uncommented @CRLF (each dot separator followed by a space (?) will generate a new line) ; $sOutput &= ($aData[$i])[0] & @CRLF ; Replace each @CRLF at the same place than the original text $sOutput &= StringReplace(($aData[$i])[0], Chr(255), @crlf) ; personal solution to prevent loss of eventual EOLs in translated text Next EndIf EndIf Return $sOutput EndFunc ;==>_GoogleAPITranslate ; https://www.autoitscript.com/forum/topic/202204-simple-google-translate/?do=findComment&comment=1505984 ; par défaut, les sauts de lignes disparaissent dans la traduction ! Trouvé un wokaround pour empêcher ça... ; ... mais on ne peut mettre n'importe quoi comme workaround (ex. Chr(255) semble marcher, d'autres chaines plus longues, non parfois car ; ... elles seraient 'coupées' en leur milieu parfois, au retour, pas approfondi) #cs Col 0 Col 1 ( issu script "creation code langues (liste issue google).au3" ) auto Détecter la langue af Afrikaans sq Albanais de Allemand am Amharique en Anglais ar Arabe hy Arménien az Azerbaïdjanais eu Basque bn Bengali be Biélorusse my Birman bs Bosniaque bg Bulgare ca Catalan ceb Cebuano ny Chewa zh-CN Chinois (simplifié) zh-TW Chinois (traditionnel) si Cingalais ko Coréen co Corse ht Créole haïtien hr Croate da Danois es Espagnol eo Espéranto et Estonien fi Finnois fr Français fy Frison occidental gd Gaélique écossais gl Galicien cy Gallois ka Géorgien gu Goudjarati el Grec ha Haoussa haw Hawaïen iw Hébreu hi Hindi hmn Hmong hu Hongrois ig Igbo id Indonésien ga Irlandais is Islandais it Italien ja Japonais jv Javanais kn Kannada kk Kazakh km Khmer rw Kinyarwanda ky Kirghize ku Kurde lo Lao la Latin lv Letton lt Lituanien lb Luxembourgeois mk Macédonien ms Malais ml Malayalam mg Malgache mt Maltais mi Maori mr Marathi mn Mongol nl Néerlandais ne Népalais no Norvégien or Odia ug Ouïghour ur Ourdou uz Ouzbek ps Pachto pa Pendjabi fa Persan pl Polonais pt Portugais ro Roumain ru Russe sm Samoan sr Serbe sn Shona sd Sindhi sk Slovaque sl Slovène so Somali st Sotho du Sud su Soudanais sv Suédois sw Swahili tg Tadjik tl Tagalog ta Tamoul tt Tatar cs Tchèque te Télougou th Thaï tr Turc tk Turkmène uk Ukrainien vi Vietnamien xh Xhosa yi Yiddish yo Yoruba zu Zoulou #ce
  24. Yesterday
  25. I really liked this script with one exception - it doesn't work for a GUI script. SO! I went in and changed it so it builds a string of a variable and then shows it before returning. I hope everyone likes it. Also included the ZIP file with my file (ie: DDW.au3) which stands for DD Windows. :-) Updated the number to v1.1.0 because it is not really a new program. :-) #cs     Copyright (c) 2020 TarreTarreTarre <tarre.islam@gmail.com>     Permission is hereby granted, free of charge, to any person obtaining a copy     of this software and associated documentation files (the "Software"), to deal     in the Software without restriction, including without limitation the rights     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell     copies of the Software, and to permit persons to whom the Software is     furnished to do so, subject to the following conditions:     The above copyright notice and this permission notice shall be included in all     copies or substantial portions of the Software.     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE     SOFTWARE. #ce #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7 #include-once ; #FUNCTION# ==================================================================================================================== ; Name ..........: DDW ; Description ...: Displays useful information about a variable or object in the console ; Syntax ........: DDW($any[, $exit = True]) ; Parameters ....: $any                 - anything. ;                  $exit                - [optional] an boolean value. Default is True. ; Return values .: None ; Author ........: TarreTarreTarre and Mark Manning (only made changes) ; Modified ......: May 9, 2024 ; Remarks .......: Made it so this works for MsgBox ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Global $__DDW_String = ""; Func DD($any, $exit = True)     $__DDW_String = @crlf & "--->Starting Debug" & @crlf & @crlf;     __DD($any, 0)     $__DDW_String &= @crlf & "<---Exiting Debug" & @crlf;     MsgBox( $MB_SYSTEMMODAL, "DDW Debug Information", $__DDW_String );     If $exit Then Exit EndFunc   ;==>DD #Region Internals Func __DD($any, $depth)     Switch VarGetType($any)         Case "Array"             __DD_Array($any, $depth)         Case "Object" And ObjName($any) == "Dictionary"             $__DDW_String &= "- ";             __DD_ScriptingDictionary($any, $depth)         Case Else             $__DDW_String &= (IsObj($any) ? '! ' : '> ');             __DD_Other($any)     EndSwitch EndFunc   ;==>__DD Func __DD_Array($array, $depth, $curI = Null, $curJ = Null, $ignoreTabs = False)     Local Const $rows = UBound($array)     Local Const $cols = UBound($array, 2)     Local $cur, $oInfo, $cwColor     If $cols == 0 Then         $curI = VarGetType($curI) == "Int32" ? StringFormat("[%d] => ", $curI) : ""         $__DDW_String &= _             (">" & __GetTabs($depth, $ignoreTabs) & StringFormat('%s(Array:%d) [', $curI, $rows) & @LF);         For $i = 0 To $rows - 1             $cur = $array[$i]             $oInfo = __GetDataInfo($cur)             $cwColor = IsObj($cur) ? (ObjName($cur) == "Dictionary" ? '-' : '!') : '>'             If IsArray($cur) Then                 __DD_Array($cur, $depth + 1, $i) ;                $__DDW_String &= ("> " & $sTabs & "]" & @LF);             ElseIf IsObj($cur) And ObjName($cur) == "Dictionary" Then                 $__DDW_String &= ("- " & __GetTabs($depth + 1) & StringFormat('[%d] => ', $i));                 __DD_ScriptingDictionary($cur, $depth + 1, True)             Else                 $__DDW_String &= ($cwColor & " " & __GetTabs($depth + 1) & _                     StringFormat('[%d] (%s:%s) => "%s"', $i, $oInfo.item("type"), _                     $oInfo.item("length"), $oInfo.item("value")) & @LF);             EndIf         Next     Else         $curI = VarGetType($curI) == "Int32" ? ($depth == 1 ? StringFormat("[%d] => ", $curI) : StringFormat("[%d][%d] => ", $curI, $curJ)) : ""         $__DDW_String &= (">" & __GetTabs($depth, $ignoreTabs) & _             StringFormat('%s(Array:%d:%d) [', $curI, $rows, $cols) & @LF);         For $i = 0 To $rows - 1             For $j = 0 To $cols - 1                 $cur = $array[$i][$j]                 $oInfo = __GetDataInfo($cur)                 $cwColor = IsObj($cur) ? (ObjName($cur) == "Dictionary" ? '-' : '!') : '>'                 If IsArray($cur) Then                     __DD_Array($cur, $depth + 1, $i, $j)                 ElseIf IsObj($cur) And ObjName($cur) == "Dictionary" Then                     $__DDW_String &= ("- " & __GetTabs($depth + 1) & _                         StringFormat('[%d][%d] => ', $i, $j));                     __DD_ScriptingDictionary($cur, $depth + 1, True)                 Else                     $__DDW_String &= ($cwColor & " " & __GetTabs($depth + 1) & _                         StringFormat('[%d][%d] (%s:%s) => "%s"', $i, $j, $oInfo.item("type"), _                         $oInfo.item("length"), $oInfo.item("value")) & @LF);                 EndIf             Next         Next     EndIf     $__DDW_String &= ("> " & __GetTabs($depth) & "]" & @LF); EndFunc   ;==>__DD_Array Func __DD_ScriptingDictionary($object, $depth, $ignoreTabs = False)     $__DDW_String &= (__GetTabs($depth, $ignoreTabs) & _         StringFormat('(Scripting.Dictionary:%d) {', $object.count()) & @LF), 5 );     For $item In $object         Local $key = $item         Local $value = $object.item($key)         Local $oInfo = __GetDataInfo($value)         If IsObj($value) And ObjName($value) == "Dictionary" Then             $__DDW_String &= (StringFormat("- " & __GetTabs($depth + 1) & "[%s] => ", $key));             __DD_ScriptingDictionary($value, $depth + 1, True)         ElseIf IsArray($value) Then             $__DDW_String &= ("> " & __GetTabs($depth + 1) & StringFormat('[%s] => ', $key));             __DD_Array($value, $depth + 1, Null, Null, True)         Else             $__DDW_String &= ("- " & __GetTabs($depth + 1) & _                 StringFormat('[%s] (%s:%s) => "%s"', $key, $oInfo.item("type"), _                 $oInfo.item("length"), $oInfo.item("value")) & @LF);         EndIf     Next     $__DDW_String &= ("- " & __GetTabs($depth) & "}" & @LF); EndFunc   ;==>__DD_ScriptingDictionary Func __DD_Other($any)     Local Const $oInfo = __GetDataInfo($any)       $__DDW_String &= (StringFormat('(%s:%s) "%s"', $oInfo.item("type"), _         $oInfo.item("length"), $oInfo.item("value")) & @LF); EndFunc   ;==>__DD_Other Func __GetDataInfo($any)     Local Const $oRet = ObjCreate("Scripting.Dictionary")     Local $type = VarGetType($any)     Local $value = $any     Local $length = StringLen($any)     Switch $type         Case "UserFunction"             ContinueCase         Case "Function"             $value = FuncName($any)             $length = StringLen($value)         Case "Object"             $type = ObjName($any)             $length = ObjName($any, 2) ; Descriptobn             $value = ObjName($any, 6) ; Clisid         Case "String"             Local $str = $any             $str = StringReplace($str, @LF, "\LF")             $str = StringReplace($str, @CR, "\CR")             $str = StringReplace($str, @CRLF, "\CRLF")             $str = StringReplace($str, @TAB, "\TAB")             $value = $str         Case "Binary"             $value = BinaryLen($any)         Case "Keyword" And $length == 0             $value = "NULL"     EndSwitch     $oRet.add("type", $type)     $oRet.add("length", $length)     $oRet.add("value", $value)     Return $oRet EndFunc   ;==>__GetDataInfo Func __GetTabs($depth, $ignoreTabs = False)     If $ignoreTabs Then Return ""     Local $sTabs     For $i = 0 To $depth - 1         $sTabs &= "    " ; @TAB     Next     Return $sTabs EndFunc   ;==>__GetTabs #EndRegion Internals Autoit-DD-1.1.0.zip
  26. @Melba23 & @Nine Deleting the menu control seems to do the job. It will position to the very left of the GUI all existing menuitem(s) control(s) . Does this work for you ? #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> $Form1 = GUICreate("Form1", 615, 437, 192, 124) $mDummymenu = GUICtrlCreateMenu("this menu control will be deleted") $menu1 = GUICtrlCreateMenuItem("click me", -1) $menu2 = GUICtrlCreateMenuItem("click me again", -1) GUICtrlDelete($mDummymenu) ; <====================== GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $menu1 MsgBox($MB_TOPMOST ,'yes!', 'it works') Case $menu2 MsgBox($MB_TOPMOST,'yes!', 'it works again') EndSwitch WEnd
  27. I think running the powershell from autoit would work and be much easier. Your'e sure right about this... But there are a few arguments which speak against taking the ready script. At first the challenge to develop something new. Thats the fun !! And i like challenges. Taking something thats already finished cuts of the whole fun of programming 🙂 And at second i also dont really like powershell scripts.
  1. Load more activity
×
×
  • Create New...