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