Ich möchte eigentlich nur kurz festhalten, dass man sehr einfach an bestimmte Teile eines Pfadstrings kommt. Dafür gibt es in der DOS Sprache vordefinierte Operatoren. Der Aufbau ist eigentlich recht einfach. Mit einer for Schleife wird eine Variable oder auch eine Liste von Elementen abgearbeitet und mit

%[%]~[option][element]

wird der gewünschte Part angesprochen.

Am besten erklärt sich das sicher mit Beispielen:

set path=D:\Daten\Backup\test.bat

:: nur der Dateiname (ohne .ext) - die Option "~n" (Name der Datei oder des Ordners) wird angesprochen, %% weil Ausführung aus einem Script heraus, a am Ende ist das Element der for Schleife
for %%a in (%path%) do set 1=%%~na
:: -> test

:: Dateiname und Erweiterung - mehrere Optionen werden einfach aneinandergereiht, %% (Scriptausführung) "~nx" (n für Name und x für Erweiterungen), b das Schleifenelement
for %%b in (%path%) do set 1=%%~nxb
:: -> test.bat

:: Pfad ohne Datei oder letzten Ordner - d für den Laufwerksbuchstaben, p für den Pfad ohne Datei/letzten Ordner
for %%c in (%path%) do set 2=%%~dpc
:: -> D:\Daten\Backup\

:: d für den Laufwerksbuchstaben, p für den Pfad ohne Datei/letzten Ordner, n für den Namen, x für die Erweitung, was kommt bei raus??
for %%d in (%path%) do set 3=%%~dpnxd
:: -> D:\Daten\Backup\test.bat

via (gute Zusammenfassung mit Beispielen)

Bei der direkten Eingabe in die CMD also ein Prozentzeichen weniger:

for %c in (D:\Daten\Backup\test.bat) do set 3=%~dpnxc

Es gibt auch noch ein paar andere Optionen, die stehen im Link unter dem Codebeispiel.

Das hilft enorm wenn man mit Dateien oder Dateisystem-Strings (also Pfade etc) arbeiten muss.

Ich fasse es nicht, seit langer Zeit nutze ich Batch und wusste nicht, dass man mehrere Befehle verknüpfen kann!

Solche Strukturen:

:install
msiexec /i test.msi
if %errorlevel%==1 goto wait
:wait
ping 127.0.0.1 -n 300 >>nul
echo retry >> %log%
goto install

lassen sich viel kürzer realisieren. Befehle lassen sich mit

&

verknüpfen! Statt für 2, 3 Befehle einen eigenen goto-Block zu erstellen könnte ich das auch so lösen:

:install
msiexec /i test.msi
if %errorlevel%==1 ping 127.0.0.1 -n 300 >>nul & echo retry >>%log% & goto install

In Batch Programmen mit mehreren hundert Zeilen entfallen dadurch dutzende kleinere Befehlsblöcke mit nur 2-5 Befehlen und der Code lässt sich viel leichter lesen!

Hinweise: (alles Vermutungen, die ich während meiner Tests bemerkt habe)

  • Vor und nach dem
    &

    Zeichen ein Leerzeichen, reduziert mögliche Fehler.

  • Vor Umleitungen (mit
    >

    oder

    >>

    ) immer ein Leerzeichen, danach keins.
    Statt

    echo test>> %log% &

    unbedingt

    echo test >>%log% &

    , sonst wird die Befehlskombination nicht korrekt ausgeführt.

  • Keine mathematischen Operationen mit set /a in einer Befehlskombi verwenden, wird ignoriert.
  • Maximal 1 if-Abfrage möglich und diese muss ans Ende der Befehlskette! Nach einer if-Abfrage werden weitere Befehle nicht ausgeführt (logischerweise…).
    echo install %loop% & if %loop%==3 echo fehler & echo %loop%

    gibt also install x aus, prüft die if Abfrage und führt alle folgenden Verkettungen nur aus, wenn die if-Abfrage true ist. Siehe Screenshot:

Mit anderen Worten: Es können einige Probleme bei der Verkettung von komplexeren Strukturen auftreten. Besser vorher einzelne Befehlskombinationen testen. Bisher funktionierten alle einfacheren 2er und 3er Verknüpfungen auf Arbeit. Je komplexer und länger die kombinierten Befehle, desto wahrscheinlicher ist aber ein fehlerhaftes Abarbeiten der Befehle.

Einfache Zählschleifen in Batch:

set /a loop=0

:install
set /a loop=%loop%+1
echo install %loop%
set installel=%errorlevel%
if %loop%==3 goto fehler
if %installel%==0 pause & goto install

:fehler
echo ### fehler ###

Der

echo install

Befehl wird 3 Mal ausgeführt und jedes Mal wird der Zähle loop nach der Ausführung um 1 erhöht. Wurde der Befehl das 3. Mal ausgeführt und erreicht erneut die

if %loop%==3

Abfrage so wird zu

:fehler

weitergeleitet.

Info

Die html7bar ermöglicht eine attraktive Platzierung von Weblinks und anderen Informationen in einer Windows 7 nachempfundenen Footer-Leiste.
Der Orb lässt sich anklicken und ein Fenster mit weiteren Links und einem Profilfoto öffnet sich. Wenn dieses Fenster geöffnet ist reicht ein Klick auf den Orb oder irgendwo außerhalb des Fensters um es zu schließen.

Voraussetzung: Auf der Seite muss jQuery eingebunden sein.

Installation

Ich erkläre die Installation der html7bar kurz in textform und weiter unten gibt es noch ein Video zum Nachmachen.

Kurz: .zip Archiv von unten downloaden, lokal entpacken, die Dateien auf den Server hochladen, Pfade in der

html7bar.html

anpassen und die .html mit php includen. Dann Links, Icons und Profilbild anpassen. Das Profilbild sollte 60x60px, Icons 16x16px bzw 32x32px groß sein.

Szenario: Ich möchte die html7bar in einem anderen Projekt einbauen. Um den Code des Projekts nicht unnötig zu vergrößern werde ich darauf hin arbeiten, dass am Ende in diesem Projekt nur noch mit

<?php include("http://url.zur/html7bar/html7bar.html"); ?>

die html7bar eingebaut wird. Somit bleibt eine eindeutige Trennung der html7bar und des ursprünglichen Projekts, der Code bleibt übersichtlich und aktivieren/deaktivieren ist durch das Auskommentieren dieser Zeile vollbracht.

In diesem Video zeige ich die Installation in weniger als 2 Minuten:

Konfiguration

Links ändern:
Sowohl die Links der Orb-Fensters als auch die Links der Taskbar sind in der

html7bar.html

enthalten. Dort könnt ihr URL und Linktext normal abändern.
Icons:
Die Icons müssen alle im

img

Unterordner liegen.
Die Maße sollten 16x16px für die Taskbaricons und 32x32px für die Orb-Fenstericons sein. Hintergrund transparent.
Die Icons werden ebenfalls in der html7bar.html entsprechend angepasst.
Profilfoto:
Das Profilfoto muss ebenfalls im

img

Ordner liegen, sollte 60x60px groß sein und wird in der

html7bar.css

in Zeile 91 (

background: url("img/profilfoto.png") no-repeat;

) angepasst.

Screenshots:

html7bar als Lesezeichen-/Linkleiste:

html7bar als persönlicher, öffentlicher Newsfeed:

Demo

Demo
aktive Version: 2.3

Testnutzung:

<?php include("http://public.hannes-schurig.de/html7bar/html7bar.html"); ?>
Download

html7bar [.zip] (100KB)
aktive Version: 2.3

Changelog


v1.0 – release
v1.0.1 – html7bar credits postlink, fix credits padding
v1.0.2 – fix bar margin (left)
v1.0.3 – several css fixes, almost no css resets anymore (3 left)
v1.1 – using sprite images instead of multiple images (where it is possible) for better performance
v1.2 – it’s now possible to hide the html7bar
v1.3 – better graphics and css, hover everywhere
v1.4 – better sliding trick for hiding the bar (http://bit.ly/oYRoBF)
v1.5 – save html7bar visibility in cookie (if possible), show/hide html7bar on revisit
a.k.a. v2.0 – bugfixes, design optimization, show/hide html7bar with cookie-saving support
v2.1 – search field in orb window now searches the blog
v2.1.1 – code cleaning in html and css, 1 error in transitional xhtml left (has to)
v2.2 – buttons for configs, about and deactivate … i’m not really into this popping-out window myself because of the colors, thinking about something different
v2.3 – finished design for config/about/deactivate-window with shadow-background

Mein neuestes Projekt könnt ihr seit Kurzem in meinem Blog sehen. Die html7bar getaufte Windows 7 nachempfundene Web Taskbar platziert sich am unteren Rand einer Webseite und sieht dort einfach mal gut aus 😉

Genutzt Techniken: HTML, CSS, jQuery

Testnutzung:

<?php include("http://public.hannes-schurig.de/html7bar/html7bar.html"); ?>

Morgen gibt’s den Download, Code, bla. Heute erstmal nur als Preview.

Klingt einfach, mit Batch die IP Adresse des Rechners auslesen und speichern. Hat mich erstaunlich lange aufgehalten eine Lösung zu finden.
Die meisten Tipps bei Google nutzen den Output von ipconfig, suchen nach einem „IP“ ähnlichen String, bearbeiten diesen und filtern die IP.
Beispiel:

:: FUNKTIONIERT NICHT!! BEI AKTUELLEREN SYSTEMEN,SIEHE UNTEN
IPCONFIG |FIND "IP" > %temp%\TEMPIP.txt
FOR /F "tokens=2 delims=:" %%a in (%temp%\TEMPIP.txt) do set IP=%%a
del %temp%\TEMPIP.txt
set IP=%IP:~1%
echo %IP% >%temp%\ip.txt

Seit Windows Vista und IPv6 funktioniert das aber nicht mehr. Ein falscher String wird abgespeichert.
Den String aus der ipconfig zu fischen ist ziemlich ungelenk, eine aktuelle und bessere Lösung zu finden ist nicht so einfach.

Lösung:

for /f "skip=1 tokens=2 delims=[]" %%* in ('ping.exe -n 1 -4 %computername%') Do (set "IP=%%*")

via

Mit dieser Zeile wird die IPv4 Adresse des aktuellen primären Interfaces gespeichert. Mit dem Parameter

-6

statt

-4

wird die primäre IPv6 Adresse in der Variable abgelegt. Funktioniert auch in Win XP, Win 7 und Server 2008.
Ich liebe Einzeiler und finde diese Lösung damit umso charmanter.

Update:
Memo an mich, einzelne Bytes der IP extrahieren:

for /f "skip=1 tokens=2 delims=[]" %%* in ('ping.exe -n 1 -4 %computername%') Do (set "IP=%%*") 
echo %IP%
:: 145.123.2.31
for /f "tokens=1,2,3,4 delims=." %%a in ("%IP%") do set IPb1=%%a&set IPb2=%%b&set IPb3=%%c&set IPb4=%%d
echo %IPb4%
:: 31

Alle Bytes der IP Adresse sind jetzt ansprechbar.
via

Der Errorlevel fängt den Rückgabewert des vorhergehenden Befehls auf und gibt ihn aus.
Also:

run bla.exe
echo %errorlevel%

Oftmals möchte ich aber zwischen dem Befehl und der Reaktion auf den Errorlevel noch weitere Befehle durchführen.
Denkbar wären auch Sprungmarken, die auf den Errorlevel reagieren. Bisher habe ich diese direkt als nächsten Befehl bearbeiten müssen, oftmal wären vorher Logeinträge oder ähnliches sinnvoll gewesen.

Heute kam ich auf die Idee den Errorlevel bestimmter Befehle einfach in Variablen zwischenzuspeichern:

:repair
%o2k10%\setup.exe /repair ProPlus /config %o2k10%\ProPlus.WW\SilentRepairConfig.xml
set repairerrorlevel=%errorlevel%
REM weitere Befehle...
echo %date% %time% - Office repariert, errorlevel: %repairerrorlevel% >> %log%
REM weitere Befehle...
if %errorlevel%==0 (goto bla) else (goto end)
:wait
ping 127.0.0.1 -n 300 >> nul
goto repair
:end
if %repairerrorlevel%==1012 goto wait
if %repairerrorlevel%==1018 goto wait
if %repairerrorlevel%==1019 goto wait
if %repairerrorlevel%==1030 shutdown -r -f -t 120 -c "Um die Office Reperatur erfolgreich abzuschliessen muss der Computer neugestartet werden. Der Computer wird in 120 Sekunden neugestartet!"

So lässt sich der Errorlevel eines Befehls beliebig oft abfragen und verarbeiten. Ohne Zwischenspeicherung wäre das nicht möglich.