Versteckte Funktionen von Windows-Batchdateien

232

Was sind einige der weniger bekannten, aber wichtigen und nützlichen Funktionen von Windows-Batchdateien?

Richtlinien:

  • Eine Funktion pro Antwort
  • Geben Sie sowohl eine kurze Beschreibung der Funktion als auch ein Beispiel an , nicht nur einen Link zur Dokumentation
  • Beschränken Sie die Antworten auf native Funktionen , dh, Sie benötigen keine zusätzliche Software wie das Windows Resource Kit

Erläuterung: Wir verweisen hier auf Skripte, die von cmd.exe verarbeitet werden. Dies ist die Standardeinstellung für WinNT-Varianten.

(Siehe auch: Windows-Batchdateien: .bat vs .cmd? )

Chris Noe
quelle

Antworten:

185

Linienfortsetzung:

call C:\WINDOWS\system32\ntbackup.exe ^
    backup ^
    /V:yes ^
    /R:no ^
    /RS:no ^
    /HC:off ^
    /M normal ^
    /L:s ^
    @daily.bks ^
    /F daily.bkf
Chris Noe
quelle
2
Ich habe diese letzte Woche gesucht! (konnte mich nicht an den Charakter erinnern)
chilltemp
21
Das ^ ist wirklich ein Zitat char. Mit dieser Option können Sie <und> in Anführungszeichen setzen, damit die Ausgabe nicht umgeleitet wird. Das ^ am Ende einer Zeile ermöglicht auch die Fortsetzung der Zeile.
Cheeso
Könnten Sie bitte dieses kleine Skript erklären?
Guerda
2
@furtelwart: Das ist das gleiche, als ob du alles in eine einzige Zeile geschrieben hättest : call C:\WINDOWS\system32\ntbackup.exe backup /V:yes /R:no /RS:no /HC:off /M normal /L:s @daily.bks /F daily.bkf. Und um alle Parameter dieser Zeile zu verstehen, führen Sie einfach aus C:\WINDOWS\system32\ntbackup.exe /?.
Kurt Pfeifle
Die eingehende Diskussion über dieses Thema, bei langen Befehlen über mehrere Zeilen verteilt
jeb
150
PUSHD path

Bringt Sie zu dem durch path angegebenen Verzeichnis .

POPD

Bringt Sie zurück zu dem Verzeichnis, aus dem Sie "gepusht" haben.

Rabe
quelle
5
Dies funktioniert auch als vollständiger Stapel, sodass Sie viele Verzeichnisse auf den Stapel verschieben und dann weiter auftauchen können, um wieder dorthin zurückzukehren, wo Sie waren.
Kibbee
Ernsthaft? Wie habe ich noch nie von dieser Funktion gehört?!
Josh Hinman
4
Führen Sie 'cmd.exe' aus, geben Sie 'help' und dann 'help pushd' oder 'pushd /?' Ein.
Paxdiablo
86
Wenn Sie auf einen UNC-Pfad pushen, wird automatisch ein Laufwerk für Sie zugeordnet und das Popd hebt die Zuordnung auf.
Ferruccio
2
+1 speziell für die UNC-Fähigkeit sollten Sie dies Ihrer Antwort hinzufügen.
Adam Mitz
109

Ich bin mir nicht sicher, wie nützlich dies in einer Batchdatei sein würde , aber es ist ein sehr praktischer Befehl, der in der Eingabeaufforderung verwendet werden kann:

C:\some_directory> start .

Dadurch wird der Windows Explorer im Ordner "some_directory" geöffnet.

Ich habe festgestellt, dass dies eine große Zeitersparnis ist.

LeopardSkinPillBoxHat
quelle
1
Nun, ich benutze es auch. Ich habe eine "open.cmd" -Datei in einem der PATH-Verzeichnisse, und das einzige, was in dieser Datei enthalten ist, ist "@start". ;)
Paulius
5
'explorer' macht dasselbe wie 'start' C: \ some_directory> explorer.
Ray
1
Ich neige dazu, dies als [Start "" einzugeben. ] (zur Verdeutlichung in Klammern), da der Start manchmal schwierig ist, wenn der erste Parameter ein Titel ist.
System PAUSE
1
Wenn Sie zufällig auf einem Mac arbeiten, open .tun Sie dasselbe.
Grant Paul
1
startmacht weit mehr als nur den aktuellen Ordner zu öffnen. Sie können jede Datei übergeben und sie wird mit dem konfigurierten Viewer geöffnet. Geben Sie ihm eine URL und Ihr Standardbrowser wird geöffnet, etc ...
idbrii
87

Ich fand es immer schwierig, Kommentare zu lesen, die in jeder Zeile mit einem Schlüsselwort gekennzeichnet sind:

REM blah blah blah

Einfacher zu lesen:

:: blah blah blah
Chris Noe
quelle
8
Ich habe gehört, dass :: effizienter ist als REM, weil REM versucht, Umgebungsvariablen für das danach auftretende Material zu erweitern, :: jedoch nicht.
Scott Langham
47
Tatsächlich ist :: nur ein Label mit einem lustigen Namen. Daher funktioniert :: nicht, wenn Sie es in einem Block (in Klammern) verwenden, da dort auch keine Beschriftungen zulässig sind. REM funktioniert dort natürlich.
Mihi
Beachten Sie jedoch, dass dies remein dokumentiertes Schlüsselwort ist, während ::es sich nur um ein Implementierungsdetail handelt. Obwohl es unwahrscheinlich ist, dass dies ::nicht mehr funktioniert, ist es im Allgemeinen ratsam, sich nicht auf undokumentiertes Verhalten zu verlassen.
Joey
Sie können sogar goto :zum Etikett springen. :-)und goto -)wird auch funktionieren.
Sven Marnach
79

Variable Teilzeichenfolgen:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
Chris Noe
quelle
3
Hässlich, aber sehr nützlich!
Guerda
1
@furtelwart klingt so könnte das Batch-Motto sein
rzrgenesys187
Dies ist ideal für die Formatierung von Daten (das Problem war jedoch, dass Vista / 7 und XP DATE unterschiedlich ausgeben)
Daniel
Beachten Sie, dass dies leider nicht mit den lokalen Variablen von FOR-Schleifen ( for %a in ...) kombiniert werden kann, da sie nicht das schließende Prozentzeichen benötigen, wie dies auch Umgebungsvariablen tun. Sie müssen sie zuerst einer Umgebungsvariablen zuweisen (mit verzögerter Erweiterung!) und dann einen Teilstring extrahieren.
RolKau
Dies ist unvermeidlich hässlich, wenn Sie etwas mit Datumsangaben machen möchten (z. B. Namen von Sicherungsdateien). Nachdem ich die allgemeine Hässlichkeit der Windows-Befehlszeile gesehen habe, sehe ich, warum Windows meistens Point & Click ist :) Obwohl sie sagen, dass die neue PowerShell besser ist.
Halil Özgür
72

Der FOR-Befehl ! Obwohl ich es hasse, Batch-Dateien zu schreiben, bin ich dafür dankbar.

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

würde jede Zeile in myfile.txt analysieren, Zeilen ignorieren, die mit einem Semikolon beginnen, und das 2. und 3. Token von jeder Zeile an den for-Body übergeben, wobei Token durch Kommas und / oder Leerzeichen getrennt sind. Beachten Sie, dass die for body-Anweisungen auf% i verweisen, um das 2. Token zu erhalten,% j, um das 3. Token zu erhalten, und% k, um alle verbleibenden Token nach dem 3. Token zu erhalten.

Sie können dies auch verwenden, um Verzeichnisse, Verzeichnisinhalte usw. zu durchlaufen.

TheSoftwareJedi
quelle
4
Ich fand die FOR-Schleifen der Batch-Dateien begrenzt und schrecklich zu schreiben, aber sie sind manchmal nützlich.
ya23
2
Entschuldigen Sie meine Verwirrung, aber wie um alles in der Welt wird dies nicht ausreichend genutzt? Ich denke, wenn Sie FOR-Schleifen nicht kennen, kennen Sie Batch-Scripting nicht.
Codierung mit Stil
11
Nicht ausreichend genutzt oder nicht, es ist Folter. (Einige würden ein notwendiges Übel argumentieren.)
Harpo
Ich musste es einige Male benutzen und die Person, die diese Syntax erfunden hat, sollte gefeuert werden. Aus einer Kanone. In die Sonne. Es ist so schlimm.
VitalyB
1
@CodingWithStyle: Jedes Mal, wenn ich eine for-Schleife in eine Batch-Datei schreiben muss, wird das Skript zu einem Bash-Launcher und schreibt das Skript stattdessen in Bash (oder Python) neu
:)
60

Anstatt ein Skript mit REM- oder :: -Linien zu verunreinigen, mache ich oben in jedem Skript Folgendes:

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

Beachten Sie, wie Sie die Pipe- und Umleitungszeichen verwenden können, ohne sie zu umgehen.

Patrick Manschette
quelle
3
Wäre noch cooler, wenn Sie% 1 auf "/?" und dann könnten Sie diesen Abschnitt als Hilfetext wiedergeben.
Demoncodemonkey
6
Hmm, gebildete Batch-Programmierung ?!
Muhammad Alkarouri
54

Der Pfad (mit Laufwerk), in dem sich das Skript befindet: ~ dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
RealHowTo
quelle
Ich benutze normalerweise% CD% dafür. Möglicherweise ist es nicht in allen DOS-Shell-Versionen verfügbar?
Saul Dolgin
11
% CD% ist das aktuelle Verzeichnis, während% ~ dp0 das Verzeichnis ist, in dem sich das laufende Skript befindet.
RealHowTo
Ich glaube auch nicht, dass% CD% vorher existiert hat ... XP vielleicht. Ich weiß, dass einige ältere Windows-Versionen es nicht haben.
Thomas Owens
1
Sie sollten stattdessen cd / d% BAT_HOME% verwenden, wenn sich der Schläger in einem anderen Laufwerk befindet. Wenn ich mich richtig erinnere, funktioniert dies jedoch nicht mit älteren DOS.
Ketorin
cd oder pushd% BATH_HOME% funktioniert nicht, wenn Sie einen Stapel auf einem Netzwerkpfad ausführen.
Benoit
49

Das Stück% ~ dp0 wurde bereits erwähnt, aber es steckt tatsächlich noch mehr dahinter: Die Zeichen nach dem ~ definieren die Informationen, die extrahiert werden.
Kein Buchstabe führt zur Rückgabe des Patch-Dateinamens
d - gibt den Laufwerksbuchstaben
p zurück - gibt den Pfad
s zurück - gibt den kurzen Pfad
x zurück - gibt die Dateierweiterung zurück
Wenn Sie also das folgende Skript test.bat aus c: \ Temp ausführen \ langer Verzeichnisname \ Ordner,

@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0

Sie erhalten die folgende Ausgabe

test
c:
\Temp\long dir name\
c:\Temp\long dir name\
.bat
c:\Temp\LONGDI~1\test.bat
\Temp\LONGDI~1\

Und wenn ein Parameter wie in
Test c: \ temp \ mysrc \ test.cpp an Ihr Skript übergeben wird
, können dieselben Manipulationen mit der Variablen% 1 durchgeführt werden.

Das Ergebnis der Erweiterung von% 0 hängt jedoch vom Standort ab!
Auf der "obersten Ebene" des Stapels wird es auf den aktuellen Stapeldateinamen erweitert.
In einer Funktion (Aufruf) wird sie auf den Funktionsnamen erweitert.

@echo off
echo %0
call :test
goto :eof

:test
echo %0
echo %~0
echo %~n0

Die Ausgabe ist (die Batchdatei wird mit myBatch.bat gestartet)

myBatch.bat
:test
:test
myBatch
Hartmut
quelle
43

Mit CALL, EXIT / B, SETLOCAL & ENDLOCAL können Sie Unterprogramme mit lokalen Variablen implementieren.

Beispiel:

@echo off

set x=xxxxx
call :sub 10
echo %x%
exit /b

:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b

Dies wird gedruckt

11
xxxxx

obwohl: sub modifiziert x.

Ferruccio
quelle
6
Sie sollten lieber goto: eof anstelle von exit / b verwenden. Dies macht dasselbe, ist jedoch die Standardmethode.
Philibert Perusse
2
Gibt es einen Standard dafür? O_o
Paulius
3
Mein Fehler. Ich dachte, Sie wollten explizit ein: eof-Label definieren und das tun. Mir war nicht klar, dass es am Ende jeder Batch-Datei ein implizites eof-Label gibt.
Ferruccio
3
Wenn Sie jedoch möchten, dass eine Unterroutine eine Fehlerstufe festlegt, müssen Sie exit / b verwenden. Zum Beispiel: Ausfahrt / b 3
Chris Noe
6
Ich habe festgestellt, dass es am besten ist, "exit / B" anstelle von "goto: eof" zu verwenden, um von einem Unterprogramm zurückzukehren. "Goto: eof" hat das Problem, dass Sie möglicherweise einen Fehlercode zurückgeben, wenn Sie ihn schlucken möchten. Wenn Sie beispielsweise "Wenn ein SomeFile-Echo vorhanden ist, ist es hier" verwenden, wird die Fehlerstufe festgelegt, wenn SomeFile nicht vorhanden ist. Dies ist jedoch nicht falsch und kein Fehlercode, den Sie zurückgeben möchten (was ist das?) goto: eof "würde tun).
Scott Langham
42

Ein hinterhältiger Trick, um N Sekunden zu warten (nicht Teil von cmd.exe, aber keine zusätzliche Software, da es mit Windows geliefert wird), siehe Ping-Zeile. Sie benötigen N + 1 Pings, da der erste Ping ohne Verzögerung erlischt.

    echo %time%
    call :waitfor 5
    echo %time%
    goto :eof
:waitfor
    setlocal
    set /a "t = %1 + 1"
    >nul ping 127.0.0.1 -n %t%
    endlocal
    goto :eof
paxdiablo
quelle
2
Noch besser ist es, dies in eine Datei wie sleep.bat zu schreiben, um Ihnen die Mühe zu ersparen, es immer wieder neu zu schreiben.
Erjiang
1
... und legen Sie die sleep.bat in ein Verzeichnis in der Umgebungsvariablen PATH
Scoregraphic
Ich bin dagegen, dies nach draußen zu stellen, macht das weniger portabel ... auf Windows-Systemen.
Sorin
37

Dem "Sanitär" entkommen:

echo ^| ^< ^> ^& ^\ ^^
Chris Noe
quelle
3
Ich wette, der DOS-Escape-Charakter ist nicht bekannt. Gut.
Joshua
12
Ah, das würde erklären, warum es auch der Zeilenfortsetzungsoperator ist - es entgeht der neuen Zeile, genau wie \ in bash ...
leander
@leander: Ja, aber es kann nur das LF entkommen (und nicht die CR), da alle CRs , bevor sie entfernt werden
jeb
Aus diesem Grund HEAD^ist es problematisch , git unter Windows zu verwenden, um sich vom vorherigen commit ( ) zu unterscheiden.
Daniel Trebbien
31

In der Lage sein, Befehle auszuführen und die Ausgabe zu verarbeiten (wie Backticks von '$ ()' in Bash).

for /f %i in ('dir /on /b *.jpg') do echo --^> %i

Wenn die Dateinamen Leerzeichen enthalten, verwenden Sie Folgendes:

for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
paxdiablo
quelle
2
Funktioniert nicht mit Dateinamen, deren Namen Leerzeichen enthalten ... Dies funktioniert: für / f "tokens = *"% i in ('dir / on / b * .jpg') do echo - ^>% i
Doekman
Guter Fang. Persönlich denke ich, dass Leerzeichen in Dateinamen böse schreckliche Dinge aus den Tiefen des neunten Kreises der Hölle sind. Aber wir sollten uns um sie kümmern, denke ich.
Paxdiablo
Das ist die verrückteste Syntax, die ich je gesehen habe. Funktioniert es, wenn Sie diese backtick.bat erstellt und die Zeichenfolge übergeben haben?
idbrii
30

Leere Datei erstellen:

> copy nul filename.ext
nzpcmad
quelle
6
@devio: echo. setzt eine leere Zeile. Die Datei wäre also nicht leer!
Paulius
4
Ich benutze type nul > filename.extdafür.
Benoit
Schön, dass ich mich lange gefragt habe, ob es ein Touch-Äquivalent gibt.
jdelator
Ich habe immer verwendetren > blah.txt
Synetech
28

Um alle Ausgaben eines Befehls auszublenden, leiten Sie zu> nul 2> & 1 um.

Beispielsweise zeigen einige Befehlszeilenprogramme die Ausgabe auch dann an, wenn Sie zu> nul umleiten. Wenn Sie die Ausgabe jedoch wie in der folgenden Zeile umleiten, wird die gesamte Ausgabe unterdrückt.

PSKILL NOTEPAD >nul 2>&1

BEARBEITEN: Eine Erläuterung der Funktionsweise finden Sie unter Ignorieren der Ausgabe eines Befehls .

Aphorie
quelle
1
Wissen Sie, wie das funktioniert? Was bedeutet das 2> & 1-Bit?
Scott Langham
12
Das> nul leitet STDOUT zu nul um. Das 2> & 1 leitet STDERR an die Stelle weiter, auf die STDOUT zeigt.
Aphorie
Insbesondere denke ich, dass 2> & 1 ein "Dateihandle-Klon" ist, der STDERR auf einen Klon von STDOUT setzt. Es ist wichtig, es nach dem> NUL zu setzen, da Sie STDOUT klonen möchten, nachdem es umgeleitet wurde, nicht vorher. (Bitte korrigieren Sie mich, wenn ich hier falsch
Leander
1
Wenn Sie sich fragen, woher PSKILL kommt, besuchen Sie sysinternals.com . Wenn Sie eine Pro Edition verwenden, sollten Sie einen nativen TSKILL-Befehl haben, der mehr oder weniger identisch ist.
Codierung mit Stil
1
Wenn Sie nicht über pskill oder tskill verfügen, werden die meisten Windows-Systeme, die ich verwendet habe, mitgeliefert taskkill.
idbrii
25
PAUSE

Stoppt die Ausführung und zeigt die folgende Eingabeaufforderung an:

Drücken Sie eine beliebige Taste, um fortzufahren . . .

Nützlich, wenn Sie einen Stapel ausführen möchten, indem Sie im Windows Explorer darauf doppelklicken, und die Ausgabe tatsächlich anzeigen möchten, anstatt nur das Befehlsfenster zu blinken.

Rabe
quelle
Ich würde dies kaum als "unbenutzt" bezeichnen, da ich es am Ende jedes Skripts, das ich schreibe, anbringe. Andererseits funktioniert es nicht so gut, wenn Ihre IDE das Skript ausführen und die Ausgabe erfassen soll, da die IDE normalerweise keine Eingabetaste für Sie drücken kann ...
Nicholas Flynt
15
Eine nette Funktion von "Pause" ist, dass wenn es kein Terminal gibt, um einen "beliebigen Schlüssel" zu empfangen (z. B. wenn Ihre Batch-Datei von einem Systemdienst ausgeführt wird), dies erkannt wird und einfach weitergeht ...
Leander
4
+1 an Charlie Somerville, das ist so bekannt, dass jedes Spielprogrammierprogramm 'go.bat' es in den frühen 90ern verwendet hat.
LiraNuna
6
Anstatt alle Ihre Batch-Dateien zu verschmutzen (und sie für CLI-Geeks ärgerlich zu machen), können Sie Start / Run / verwenden und dann 'cmd / k' und den Namen der Batch-Datei eingeben. ODER ändern Sie die Standardzeichenfolge von HKCR \ batfile \ shell \ open \ command in 'cmd / k "% 1"% *'. ODER erstellen Sie eine weitere Batchdatei, auf der nur '@cmd / k $ *' ausgeführt wird, legen Sie sie auf dem Desktop ab und legen Sie Ihre anderen Batchdateien darauf ab. Es gibt viele Alternativen zu PAUSE. Bitte beachten Sie sie.
System PAUSE
1
@gnud: Sie können immer noch zum Skript weiterleiten: Dies echo.|batch-with-pause.bathat den gleichen Effekt wie das Drücken der ' Any -Taste' ...
Kurt Pfeifle
25

Das Äquivalent der Bash (und anderer Muscheln)

echo -n Hello # or
echo Hello\\c

welches " Hello" ohne nachgestellten Zeilenumbruch ausgibt. Ein cmd-Hack, um dies zu tun:

<nul set /p any-variable-name=Hello

set /pist eine Möglichkeit, den Benutzer zur Eingabe aufzufordern. Es gibt die angegebene Zeichenfolge aus und wartet dann (in derselben Zeile, dh ohne CRLF), bis der Benutzer eine Antwort eingibt.

<nul leitet einfach eine leere Antwort an die weiter set /p Befehl weiter, sodass das Nettoergebnis die ausgegebene Eingabeaufforderungszeichenfolge ist. (Die verwendete Variable bleibt aufgrund der leeren Antwort unverändert.)

Probleme sind: Es ist nicht möglich, ein führendes Gleichheitszeichen auszugeben, und unter Vista werden führende Leerzeichen entfernt, jedoch nicht unter XP.

paxdiablo
quelle
18

Suchen und Ersetzen beim Festlegen von Umgebungsvariablen:

> @set fname=%date:/=%

... entfernt das "/" von einem Datum zur Verwendung in Dateinamen mit Zeitstempel.

und Teilzeichenfolgen auch ...

> @set dayofweek=%fname:~0,3%
SqlACID
quelle
17

Ganzzahlige Arithmetik:

> SET /A result=10/3 + 1
4
Chris Noe
quelle
Wie lange kann SET schon rechnen? Windows XP?
Chakrit
1
Wenn Sie fragen, wie groß die Werte sein können, glaube ich, dass dies 32-Bit ist. Also +/- 2 Milliarden.
Chris Noe
1
Ich denke, die Frage war, wie lange SET schon rechnen konnte. Seit Windows XP?
Michael Myers
3
Ich denke, CMD.EXEs SET konnte seit NT 3.1 oder so berechnen. Es dauerte nur lange, bis jemand bemerkte, dass CMD.EXE nicht genau das gleiche war wie COMMAND.COM ...
RBerteig
16

Befehlstrennzeichen:

cls & dir
copy a b && echo Success
copy a b || echo Failure

In der zweiten Zeile wird der Befehl nach && nur ausgeführt, wenn der erste Befehl erfolgreich ist.

In der 3. Zeile der Befehl nach || Wird nur ausgeführt, wenn der erste Befehl fehlgeschlagen ist.

Doekman
quelle
15

Leere Zeile ausgeben:

echo.
paxdiablo
quelle
15

Sie können if-Anweisungen verketten, um einen Effekt wie ein kurzgeschlossenes boolesches `und 'zu erzielen.

if foo if bar baz
Jack
quelle
1
Dies ist wirklich nur eine Abkürzung für das Verschachteln von ifs: if foo ( if bar ( baz ) )(Stellen Sie sich Zeilenumbrüche nach den Klammern vor.)
idbrii
14

So konvertieren Sie schnell eine Unicode-Textdatei (16 Bit / Zeichen) in eine ASCII-DOS-Datei (8 Bit / Zeichen).

C:\> type unicodeencoded.txt > dosencoded.txt

Als Bonus werden die Charaktere nach Möglichkeit korrekt zugeordnet.

RealHowTo
quelle
1
Das ist eine ANSI-DOS-Datei - ASCII ist 7bit / char.
MarkJ
Lol, dies ist ein Anti-Pattern, diese Konvertierung wird mit hoher Wahrscheinlichkeit fehlschlagen. Die einzige 8-Bit-Codierung, die Unicode unterstützt, ist UTF-8, aber dank M $ kann die UTF-8-Codepage unter Windows nicht eingestellt werden.
Sorin
14

wenn Blockstruktur:

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)
Ferruccio
quelle
3
Solange Sie wissen, dass Variablen auf einmal erweitert werden (ohne verzögerte Erweiterung) - dh Sie können% ERRORLEVEL% dort nicht sinnvoll verwenden.
Duncan Smart
Sie können dort auch keine Beschriftungen verwenden (einschließlich dieser :: style-Kommentare), da dadurch die if-Anweisung vorzeitig beendet wird.
Codierung mit Stil
2
@ Duncan: Du solltest die Pseudovariable %ERRORLEVEL%sowieso nicht verwenden ; dafür if errorlevel <foo>ist es da. Und das funktioniert tatsächlich in solchen Blöcken.
Joey
12

Verzögerte Erweiterung von Variablen (wobei Teilzeichenfolgen für ein gutes Maß eingeworfen werden):

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set full=/u01/users/pax
:loop1
    if not "!full:~-1!" == "/" (
        set full2=!full:~-1!!full2!
        set full=!full:~,-1!
        goto :loop1
    )
    echo !full!
    endlocal
paxdiablo
quelle
12

Bietet nicht viele Funktionen, aber Sie können den Befehl title für einige Zwecke verwenden, z. B. zum Bereitstellen des Status eines langen Skripts in der Taskleiste oder nur zum Verbessern des Benutzerfeedbacks.

@title Searching for ...
:: processing search
@title preparing search results
:: data processing
Hartmut
quelle
2
Interessant. Obwohl Sie danach anscheinend die reguläre Funktion verlieren, die den aktuell ausgeführten Befehl anzeigen soll. Gibt es eine Möglichkeit, dies zurückzusetzen?
Chris Noe
2
technet.microsoft.com/en-us/library/bb491017.aspx sagt, dass es mit "title" alleine zurückgesetzt werden kann, aber dies scheint unter Windows 7 nicht zu funktionieren ...
ℳ.
11

Sie haben keinen Editor zur Hand und müssen eine Batch-Datei erstellen?

copy con test.bat

Geben Sie einfach die Befehle ein und drücken Sie die Eingabetaste, um eine neue Zeile zu erhalten. Drücken Sie Strg-Z und die Eingabetaste, um die Datei zu schließen.

Hartmut
quelle
4
Heh, das bringt mich zurück.
Codierung mit Stil
11

Beispiel für die Subtraktion von Zeichenfolgen dateund timezum Abrufen der Datei "JJJJ-MM-TT HH: MM: SS.txt"

echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"

Ich gebe coloran, ob mein Skript erfolgreich ist, fehlgeschlagen ist oder eine Eingabe benötigt, indem ich die Farbe von Text und Hintergrund ändere. Es ist wirklich hilfreich, wenn Sie eine Maschine in Reichweite haben, aber ziemlich weit weg

Farbe XY

Dabei ist X und Y ein Hex-Wert von 0bis F, wobei X-Hintergrund, Y-Text, wenn sich die Farbe X = Y nicht ändert.

Farbe Z.

Ändert die Textfarbe in 'Z' und setzt den schwarzen Hintergrund, 'Farbe 0' funktioniert nicht

Für Namen von Farben rufen Sie an

Farbe ?

MoreThanChaos
quelle
bearbeitet; Die _s wurden als kursiv interpretiert. Nettes Stück Code.
@ Duncan Smart: nicht wahr, funktioniert auch in UK Englisch (obwohl es technisch "Farbe" sein sollte, grrr)
Demoncodemonkey
10

Vollständige Kontrolle über die Ausgabe mit Abstands- und Escapezeichen.:

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>
paxdiablo
quelle
1
Wie funktioniert das? Der Punkt markiert den Anfang der Textausgabe?
Chris Noe
3
"echo. x" gibt "<Leerzeichen> x" aus, "echo x" gibt nur "x" aus. Dies ermöglicht führende Räume. Außerdem verhindert das Escape-Zeichen "^", dass cmd denkt, dass alle Zeichen "<" und ">" eine E / A-Umleitung sind.
Paxdiablo
1
echo (ist besser, weil echo. eine Dateisuche nach einer Datei mit dem Namen "echo" erstellt, wenn diese Datei existiert, schlägt das Echo fehl. Wenn nicht, wird das interne Echo ausgeführt, aber es ist langsamer als echo (
jeb
9

TheSoftwareJedi hat den Befehl for bereits erwähnt, aber ich werde ihn noch einmal erwähnen, da er sehr leistungsfähig ist.

Im Folgenden wird das aktuelle Datum im Format JJJJMMTT ausgegeben. Ich verwende dies beim Generieren von Verzeichnissen für Sicherungen.

for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a
remonedo
quelle
2
Sicherlich gibt DATE / T den 29.10.2008 in Europa und den 29.10.2008 in den USA zurück ... daher ist möglicherweise eine Lokalisierung erforderlich! ;-)
Das stimmt! Sie können den Befehl date jedoch missbrauchen, um herauszufinden, welches Datumsformat verwendet wird.
Remonedo
4
Es ist übermäßiger Gebrauch von FOR, imo. Ich denke, ich würde nur% DATE: ~ 10,4 %% DATE: ~ 4,2 %% DATE: ~ 7,2% dafür verwenden, anstatt einen Datumsbefehl auszuführen und ihn dann zu analysieren.
Codierung mit Stil