Fr, 15. August, 2014

Chocolatey: Ersatz für choco list mit lokalem Cache

Ich habe mich mit Chocolatey angefreundet, verfluche aber die langsame Paketsuche.
Was man da machen kann? Nun, eine Batch-Datei schreiben, die die Paketliste lokal speichern kann und diesen Cache durchsucht.

Die Funktion ist nicht mit choco list [Suchbegriff] identisch, da hier auch Metainformationen gesucht werden - die Suche in meinem Skript geht rein auf Paketnamen, ist dafür aber wirklich massiv schneller!!

Der Cache wird 1 x pro Tag erneuert - oder bei manuellem Aufruf mit Parameter -u (=update).
Die Hilfe erscheint bei Aufruf ohne einen Parameter:

===== CHOCO PACKAGE SEARCH WITH LOCAL CACHE =====
DESCRIPTION:
clist2 is a choco list to search public packages that uses a local cache
SYNTAX:
  clist2 [searchstring]
     searchstring: part of a package, case insensitive,
     regex allowed i.e. ”^fire” to find the firefox
     clist2 ”^fire”
  clist2 -i
     infos about cachefile
  clist2 -u
     force update of local package list (it takes a while)


Das Grundprinzip ist wie folgt:

(1) Die Ausgabe der normalen Paket-Auflistung wird in einer Textdatei lokal gespeichert:

choco list >[Dateiname]

(2) Wenn man ein Paket sucht, dann wird in dieser Textdatei gesucht. Dabei ist findstr hilfreich - man kann so auch Regex als Suchbegriff verwenden. Der Parameter /i sorgt für caseinsensitive Suche.

type [Dateiname] | findstr /i %1 %2 %3 %4 %5 %6 %7 %8 %9

Der Rest ist etwas mehr Comfort und sinnvolle Ausgabe drumherum.

Der komplette Quellcode meiner Bastelstunde (Inhalt als clist2.bat speichern und in C:\ProgramData\chocolatey\bin\ ablegen):

@echo off
rem ======================================================================
::
::  CHOCO PACKAGE SEARCH WITH LOCAL CACHE
::
rem ———————————————————————-
::  2014-08-15  axel-hahn.de  first lines
rem ======================================================================
rem ———————————————————————-
::  config
rem ———————————————————————-
    set pkglistPrefix=%temp%chocopackages_
    set pkglist=”%pkglistPrefix%%DATE%.txt”
    set pkgwork=”%pkglistPrefix%%DATE%.tmp”
rem ———————————————————————-
::  main
rem ———————————————————————-
    if ”%1” EQU ”" goto help
    if ”%1” EQU ”-i” goto cacheinfo
    if ”%1” EQU ”-u” goto update
    if not exist %pkglist% goto update
    
rem ———————————————————————-
::  subroutines
rem ———————————————————————-
    rem —– search
    type %pkglist%  | findstr /v ”META:” | findstr /i %1 %2 %3 %4 %5 %6 %7 %8 %9
    goto END
rem ———————————————————————-
::  subroutines
rem ———————————————————————-
    rem —– show help
    :help
    echo.
    echo ===== CHOCO PACKAGE SEARCH WITH LOCAL CACHE =====
    echo.
    echo DESCRIPTION:
    echo %~n0 is a choco list to search public packages that uses a local cache
    echo.
    echo SYNTAX:
    echo.
    echo   %~n0 [searchstring]
    echo      searchstring: part of a package, case insensitive, 
    echo      regex allowed i.e. ”^fire” to find the firefox
    echo      %~n0 ”^fire”
    echo.
    echo   %~n0 -i
    echo      infos about cachefile
    echo.
    echo   %~n0 -u
    echo      force update of local package list (it takes a while)
    echo.
    goto END
    rem —– show infos about cache
    :cacheinfo
    echo Cachefile is %pkglist%
    rem dir %pkglist% | findstr ”^[0-9]”
    type %pkglist%  | findstr ”META:”
    echo.
    goto END
    
    rem —– update local cache file    
    :update
    call :cacheinfo
    echo INFO: refreshing local package list …
    choco list >%pkgwork%
    echo META:LAST_UPDATE_OF_CACHE:%DATE% %TIME% >>%pkgwork%
    del %pkglistPrefix%*.txt 2>nul
    move %pkgwork% %pkglist% >nul
    echo.
    call :cacheinfo
    goto END
    
    :END

Updates:

  • 18.08.2014: Fix line 24 to: if not exist %pkglist% goto update

Abonnieren