Da CMD sich selbst beenden würde, wenn du den Prozess "cmd.exe" versuchst zu killen, musst du über die Prozess-ID gehen. Die findest du raus mit Hilfe einer Befehlsreihe aus FOR, FINDSTR und TASKLIST:

title asdfghuio
FOR /F "tokens=2" %A IN ('tasklist /NH /V /FI "imagename eq cmd.exe" ^| findstr /V asdfghuio') DO taskkill /PID %A

Als Erkennungsmerkmal für das aktuell gestartete CMD-Fenster legst du den Fenstertitel "asdfghuio" fest oder irgendwas anderes einzigartiges, was in der Batchdatei wohl nicht als Titel steht.

Der TASKLIST-Befehl listet alle gestarteten Prozesse auf. /NH entfernt die Überschriften (No Header). /V zeigt mehr Infos an, darunter auch den Fenstertitel. /FI initiiert einen Filter, hier "cmd.exe" als Prozessname.

In der Ausgabe des TASKLIST-Befehls schließt der FINDSTR-Befehl alle Zeilen aus, die "asdfghuio" enthalten, was wohl nur das aktuelle CMD-Fenster sein dürfte. Übrig bleiben alle "cmd.exe"-Prozesse außer dem aktuellen Fenster.

Für jeden gefundenen Prozess wird der TASKKILL-Befehl verwendet, der aber nicht "cmd.exe" beendet, sondern den Prozess mit der Prozess-ID "%A".

...zur Antwort

TASKLIST gibt immer "Erfolg" als Antwort. Du kannst aber über den FINDSTR-Befehl arbeiten:

tasklist /fi "Imagename eq taskmgr.exe" | findstr /i /C:"taskmgr.exe" >nul 2>nul && goto run || goto notrun
...zur Antwort

Wenn sicher ist, dass immer nur zwei Wörter gesucht werden, geht:

FOR /F "tokens=2,4 delims=;" %%A IN ("%VARIABLE1 %") DO (
  set VARIABLE2=%%A
  set VARIABLE3=%%B
)

Wenn es auch mehr oder weniger als zwei Wörter sein können, würde ich über den SHIFT-Befehl gehen:

Setlocal EnableDelayedExpansion
set WordNo=1
set VARIABLE1 =%VARIABLE1 :"={%
set VARIABLE1 =%VARIABLE1 :;="%

call :Function_ExtractEnclosed %VARIABLE1 %
FOR /L %%A IN (2,1,!WordNo!) DO set VARIABLE%%A=!Variable%%A:{="!
set VARIABLE1 =%VARIABLE1 :"=;%
set VARIABLE1 =%VARIABLE1 :{="%

[...]

exit

:Function_ExtractEnclosed
  if %1 == "%~1" (
    set /a WordNo+=1
    set VARIABLE!WordNo!=%~1
  )
  shift /1
  if "%~1" == "" exit /b
goto Function_ExtractEnclosed

Dieser Code ersetzt zuerst alle Anführungszeichen in VARIABLE1 mit { und dann alle Semikolon mit Anführungszeichen. Das ist wichtig, damit der SHIFT-Befehl korrekt arbeitet. Dabei hilft das { nur, dass die neuen Anführungszeichen mit den alten nicht in Konflikt geraten. Der ursprüngliche Wert wird später wiederhergestellt.

Anschließend ruft der Code eine Funktion auf (CALL-Befehl) mit VARIABLE1 als Parameter.

Die Funktion prüft, ob der nächste Parameter von Anführungszeichen umschlossen ist. Ist das der Fall, handelt es sich um ein gesuchtes Wort. Dann wird es in der nächsten Variable abgespeichert.

Sind alle Parameter abgearbeitet, beendet sich die Funktion (EXIT /B).

Anschließend werden in sämtlichen Variablen die Anführungszeichen wiederhergestellt.

Ein Tipp übrigens: Benutz in den Namen von Variablen keine Leerzeichen. Das kann zu Verwirrung führen.

...zur Antwort

Ganz einfach: mit dem FTP-Befehl.

Anders als im aktiven CMD-Fenster musst du in Batch eine automatisierte Version laufen lassen, was nur mit Hilfe einer separaten Datei geht. Die lässt du mit Hilfe des ECHO-Befehls erstellen und rufst sie anschließend auf.

Hier ein Beispiel:

echo open [Adresse zum FTP-Server]>FTP-Datei.tmp
echo user [Benutzername]>>FTP-Datei.tmp
echo [Passwort]>>FTP-Datei.tmp
echo ascii>>FTP-Datei.tmp
echo cd [Pfad/zum/Zielordner]>>FTP-Datei.tmp
echo get [Dateiname.txt]>>FTP-Datei.tmp
echo bye>>FTP-Datei.tmp

ftp -n -s:FTP-Datei.tmp
del /F FTP-Datei.tmp

Der Code erstellt die "FTP-Datei.tmp" mit den gewünschten Befehlen. "CD" wechselt das Verzeichnis auf dem Server, alle anderen Befehle sind selbsterklärend. Die eckigen Klammern musst du weglassen, die sollen nur zeigen, dass du dort etwas ersetzen musst.

Anschließend wird die Datei mit dem FTP-Befehl aufgerufen. "-n" bewirkt, dass dich der Server nicht nach Anmeldedaten fragt, sondern du sie automatisch übergibst. "-s" bewirkt, dass FTP sich die Befehle aus der Datei zieht.

Am Ende wird die erstellte Datei wieder gelöscht.

...zur Antwort

Weil /AD nur Verzeichnisse anzeigt. Benutz "dir /A-D /B *.jpg".

Und du musst "%%A" statt "%%A*.jpg" benutzen. Außerdem kannst du nicht mehrere Dateien gleich benennen. Es kann nur eine %name%.jpg geben.

...zur Antwort
FOR /F "delims=" %%A in ('dir /AD') DO copy "Q:\uell\Datei" "%~fA\Datei"
...zur Antwort

Der folgende Code benutzt die Farbfunktion des FINDSTR-Befehls, um nur einzelne Wörter farbig darzustellen. Da er Dateien erstellen muss, brauchst du Zugriff auf das Dateisystem, damit er funktioniert.

Die Funktion "ColorText" hat den Code

:ColorText [%1 = Color] [%2 = Text]
  set /p ".=." > "%~2" <nul
  findstr /v /a:%1 /R "^$" "%~2" nul 2>nul
  set /p ".={BS}{BS} {BS}{BS}" <nul
  del "%~2" >nul 2>nul
exit /b

Die Funktion wird aufgerufen mit dem Befehl

call :ColorText FarbCode "Text"

Sie erstellt zuerst eine Datei mit Dateinamen "Text" und einem einzelnen Punkt als Inhalt mit Hilfe des SET/P-Befehls.

Anschließend zeigt sie per FINDSTR diese Datei mit Inhalt an. Mit dem /a-Parameter wird angegeben, welche Farbe der Dateiname bei der Ausgabe haben soll. Dadurch wird der Text eingefärbt.

Mit einem weiteren SET/P-Befehl überschreibt der CMD-Cursor die letzten beiden Zeichen mit Leerzeichen. {BS} musst du mit Ascii-Zeichen 08 ersetzen (Alt gedrückt halten und 08 auf dem Ziffernblock eingeben, funktioniert nur mit Skript-Notepads wie Notepad++). BS steht für Backspace. Grund dafür ist, dass FINDSTR's Ausgabe "Dateiname:Inhalt" entspricht. Der Inhalt ist ein einzelner Punkt. Er und der Doppelpunkt würden sonst stehen bleiben.

Beispiel:

echo Das sind farbliche Texte:
echo.
set /p ".=Text vor " <nul
call :ColorText 0a "der Farbe"
set /p ".=, dazwischen " <nul
call :ColorText 0c "[Hier ist rot]"
set /p ".= und danach." <nul
echo.
...zur Antwort

Mach es ohne das /F. Das /F erzwingt nämlich das Beenden (/Force). Ohne das ist es als würdest du mit der Maus auf das X zum Beenden klicken.

...zur Antwort

Mit dem SETLOCAL-Befehl kannst du ermöglichen, eine Variable in einer FOR-Schleife mehrmals zu ändern. Um Zeilenumbrüche zu übernehmen, musst du sie extra mitschreiben lassen, unten z. B. über die LF-Variable. Die beiden Leerzeilen nach dem SET-Befehl sind dabei wichtig.

Setlocal EnableDelayedExpansion
set LF=^

FOR /F "delims=" %%A IN ('ipconfig') DO if "!Ausgabe!" == "" (set Ausgabe=%%A) ELSE (set Ausgabe=!Ausgabe!!LF!%%A)
echo.!Ausgabe!

Die IF-Unterscheidung verhindert, dass eine Leerzeile am Anfang von !Ausgabe! steht.

Du kannst !Ausgabe! nur als Zeichenfolge verwenden, sie ist syntaktisch unbrauchbar. Das bedeutet, du kannst auf diese Weise nicht mehrere Batchbefehle speichern und ausführen.

...zur Antwort

Ich gehe davon aus, dass beide CSV-Dateien Semikolon als Trennzeichen haben. Außerdem gehe ich davon aus, dass in der ersten Tabelle noch keine einzige Artikelnummer steht (abgesehen von der Überschrift). Es wird fortlaufend geschrieben, ohne eine Artikelnummer aus Tabelle 2 zu einer Artikelbezeichnung aus Tabelle 1 zu matchen.

@echo off
Setlocal EnableDelayedExpansion
set CounterA=1
set CounterZ=0
FOR /F "delims=;" %%A IN ('type "Tabelle 2.csv"') DO (
  set /a CounterA+=1
  set Artikel!CounterA!=%%A
)
FOR /F "tokens=1,* delims=;" %%A IN ('type "Tabelle 1.csv"') DO (
  set /a CounterZ+=1
  set Zeile!CounterZ!=%%A;%%B
)
echo !Zeile1!>NonExistentFile.csv
FOR /L %%A IN (2,1,!CounterA!) DO echo !Artikel%%A!;!Zeile%%A! >> NonExistentFile.csv
set /a CounterA+=1
FOR /L %%A IN (!CounterA!,1,!CounterZ!) DO echo ;!Zeile%%A! >> NonExistentFile.csv
ping localhost -n 2 >nul
move /Y "NonExistentFile.csv" "Tabelle 1.csv"
pause
exit /b

 

Nun zur Erklärung:

Die Datei liest alle Artikelnummern aus "Tabelle 2.csv" ein und speichert sie in fortlaufend nummerierten Variablen "Artikel2" bis "ArtikelX". Hat "Tabelle 2.csv" ebenfalls Überschriften, musst du in den ersten FOR-Befehl ein "skip=1 " vor "delims=;" einbauen.

Anschließend liest sie alle Zeilen aus "Tabelle 1.csv" ein und speichert sie in fortlaufend nummerierten Variablen "Zeile1" bis "ZeileY", wobei "Zeile1" die Überschrift ist.

Jetzt wird eine Datei namens "NonExistentFile.csv" erstellt, die am Ende "Tabelle 1.csv" überschreiben wird.

Jede Artikelnummer wird mit der Zeile mit derselben fortlaufenden Nummer in "NonExistentFile.csv" geschrieben, allerdings um 1 verschoben, damit die Überschrift bleibt. Gibt es mehr Zeilen als Artikelnummern, werden die restlichen Zeilen ohne Artikelnummer ans Ende der Datei gehängt. Gibt es mehr Artikelnummern als Zeilen, steht hinter den übrigen Artikelnummern nichts mehr. Sie werden aber alle übernommen.

Damit die Festplatte genug Zeit zum Schreiben hat, wird per PING eine Sekunde gewartet. Zu guter letzt wird die temporäre Datei "NonExistentFile.csv" auf "Tabelle 1.csv" verschoben.

Die Datei wurde erfolgreich getestet unter Windows 10 Home.

...zur Antwort

Entweder nur "D:" eingeben ohne den CD-Befehl oder "cd /D D:\". Mit /D kannst du auch das Laufwerk wechseln.

Mit "Befehl /?" lässt sich zu vielen Befehlen Hilfe anzeigen.

...zur Antwort

Bernys Ansatz war richtig, allerdings musst du vorher "Setlocal EnableDelayedExpansion" benutzen, damit du die Variable in der FOR-Schleife weiterverarbeiten kannst:

Setlocal EnableDelayedExpansion
set LF=^


FOR /F "delims=" %%A IN (Datei) DO set Inhalt=!Inhalt!!LF!%%A
echo !Inhalt!

Das "LF" dient dazu, Zeilenumbrücke mit zu übergeben. Die beiden Zeilen darunter müssen frei bleiben, damit es funktioniert.

...zur Antwort

MrXDsmileLP könnte recht haben: In der Aufgabenplanung sind viele Befehle, die unregelmäßig ausgeführt werden. Einige davon öffnen für den Bruchteil einer Sekunde das CMD-Fenster, zum Teil auch um einen Dienst zu starten.

Durch Deaktivieren unnötiger Dinge in der Aufgabenplanung kannst du das verhindern. Als ich mich damals da durchgekämpft habe (mit Hilfe von Google), habe ich mir leider keine Notizen gemacht, also kann ich dir nicht sagen, an welcher Planung es genau liegt.

...zur Antwort

In der Regel empfiehlt es sich, vor Ausführung eines Befehls zu prüfen, ob er auf Fehler stoßen könnte, z. B. statt "start Miep.bat"

if exist Miep.bat start Miep.bat

Ist das nicht möglich, musst du zwischen EXE-Dateien und BAT-Dateien unterscheiden. EXE-Dateien sind einfacher:

tasklist /FI "imagename eq Befehl.exe" /V /NH | findstr /C:"Not Responding" >nul 2>nul && start Continue.bat

Diese Befehlsfolge listet erst alle Prozesse namens "Befehl.exe" auf (/V = mehr Infos anzeigen, /NH = ohne Überschriften) und schaut, ob sie hängen (Not Responding). Falls dem so ist (&& führt dazu, dass der folgende Befehl nur ausgeführt wird, falls der vorige Befehl erfolgreich war), wird "Continue.bat" gestartet. Sollten mehrere Prozesse mit  demselben Namen gestartet sein, reicht ein einziger hängender Prozess zum Start von "Continue.bat".

Handelt es nicht um eine EXE-Datei, sondern um eine BAT-Datei, musst du über die Prozess-ID (PID) oder den Fenstertitel gehen, da Batchdateien in einem CMD-Prozess ausgeführt werden. Um mit einem zweiten CMD-Prozess den ersten zu identifizieren und zu beenden, ohne sich selbst zu killen, empfehle ich über den Fenstertitel zu gehen.

Den Titel eines CMD-Fensters änderst du mit dem TITLE-Befehl. So kannst du im Nachhinein jedes Fenster eindeutig identifizieren.

Verwendest du zwei verschiedene CMD-Fenster, erkennst du mit folgendem Befehl den gewünschten Prozess:

tasklist /FI "imagename eq cmd.exe" /FI "windowtitle eq Fenstertitel von CMD" /V /NH | findstr /C:"Not Responding" >nul 2>nul && start Continue.bat

Zusätzlich zu der EXE-Datei wird hier noch der Fenstertitel überprüft.

...zur Antwort

Du kannst den Inhalt mit FOR und SET einlesen und mit SET bearbeiten. Mit ECHO kannst du den Text in eine Datei schreiben.

Dafür ist es notwendig, den genauen Aufbau des Inhaltes zu kennen. Da du den selbst bestimmst, bist du hier flexibel.

Ich schreibe prinzipiell immer erst einen Variablennamen, dann ein Gleichheitszeichen und dann den Inhalt der Variable in einer Datei, z. B.

Miep=Das hier ist der Wert.

Diese Zeile könnte ich dann wie folgt auslesen:

FOR /F "tokens=1,* delims==" %%A IN (Datei.txt) DO set %%A=%%B
set Miep=%Miep:ist=war%
echo %Miep%>"Neue Datei.txt"

Nach /F kannst du in dem FOR-Befehl angeben, mit wie vielen voneinander abgeschottete Zeichenfolgen du arbeiten willst ("Tokens") und welche Zeichen als Trennzeichen gewertet werden ("delims" = "delimiters").

In meinem Beispiel wird nur die erste Zeichenfolge von allen darauf folgenden getrennt durch ein Gleichheitszeichen. Diese Zeichenfolgen rufe ich mit "%%A" und "%%B" auf. Gäbe ich mehr verschiedene an, wäre Token 3 "%%C", Token 4 "%%D" usw. Mit dem SET-Befehl speichere ich den Wert in der Variable.

Anschließend verwende ich einen weiteren SET-Befehl, um das Wort "ist" im Inhalt der Variable "Miep" mit dem Wort "war" zu ersetzen. Der neue Inhalt entspricht dann "Das hier war der Wert.".

...zur Antwort

Der Befehl dazu lautet

echo <Passwort> | RunAs /user:<Benutzername> Programm

Wenn du möchtest, dass das Passwort vom Benuzter angefordert wird, lass alles vor "RunAs" weg.

...zur Antwort
for schleife Batch Datei Datum formatieren?

Hi Leute ich habe ein Problem mit einer .bat (Batch)

Ausgangsdatei: test.csv hat folgenden Inhalt: 1;201520;52850;0001;UA;4056204084816;in_stock;;745;1;0;Y;N 1;201520;52857;0001;UA;4055263786044;in_stock;;486;1;0;Y;N 1;201520;52858;0001;UA;4055263856440;in_stock;;1733;1;0;Y;N 1;201520;52859;0002;UA;4055263855719;in_stock;;880;1;0;Y;N 1;201520;52860;0002;UA;4055263884474;in_stock;;1157;1;0;Y;N 1;201520;52861;0001;UA;4055263299247;in_stock;;902;1;0;Y;N 1;201520;52862;0001;UA;4055263780097;in_stock;;739;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;in_stock;;55;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20151103;4715;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20151229;445;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20160119;1300;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20160202;1238;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20160209;389;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20160216;160;1;0;Y;N 1;201520;67195;0001;UA;4049754368031;in_stock;;0;1;0;Y;N 1;201520;70287;0002;UA;4051909278393;in_stock;;0;1;0;Y;N 1;201520;70287;0003;UA;4051909278379;in_stock;;0;1;0;Y;N

Was ich nun brauche ist das alle mit "in_stock" rausfliegen und nur die erste Zeile mit "incoming" erhalten bleibt. Zudem muß die Spalte mit dem Datum von 20151103 in 03.11.2015 umformatiert werden. Bisher steht in meiner bat folgendes:

@echo off & setlocal
set "quellordner=C:\tmp\vorher\"
set "zielordner=C:\tmptest\"

pushd "%quellordner%"
for /f "delims=" %%i in ('dir /b /a-d test.csv') do findstr /v "in_stock" "%%i">"%zielordner%\%%i"
popd

jedoch bekomme ich so nur die incomming und

...zur Frage
@echo off
cd C:\tmp\vorher
Setlocal EnableDelayedExpansion
FOR /F "tokens=1-13 delims=;" %%A IN ('findstr "incoming" "test.csv"') DO (
  if not defined Datum (
    set Datum=%%H
    set Datum=!Datum:~6,2!.!Datum:~4,2!.!Datum:~0,4!
  )
  if not defined Zeile set Zeile=%%A;%%B;%%C;%%D;%%E;%%F;%%G;!Datum!;%%I;%%J;%%K;%%L;%%M
)
echo !Zeile!>"C:\tmptest\test.csv"
exit /b

Der FOR-Befehl teilt die Zeilen jeweils in 13 Zellen auf mit Semikolon als Trennzeichen. Von der ersten Zeile mit "incoming" wird die 8. Zelle (%%H = Datumsspalte) gespeichert und in das gewünschte Format geändert.

Anschließend wird die komplette Zeile kopiert, allerdings statt der 8. Zelle das Datum im neuen Format geschrieben.

Die bearbeitete (einzelne) Zeile wird in die gewünschte Datei geschrieben und CMD schließt sich.

...zur Antwort

Du fragst die Eingaben falsch ab. Richtig ist

set /p Variable=Frage: 
if "%Variable%" == "Inhalt 1" Befehl 1
if "%Variable%" == "Inhalt 2" Befehl 2
Befehl 3, der ausgeführt wird, wenn IF1 und IF2 nicht zutreffen.

Beispiel:

:B1
echo.
echo Wow... Interessant! Willst du was suesses sehen?
set /p B11=
if /i "%B11%"=="ja" goto C11
if /i "%B11%"=="nein" goto C12
echo Falsche Eingabe, du musst Ja oder Nein eingeben.
pause
goto B1

Wenn nämlich keine IF-Bedingung zutrifft, fährt CMD mit dem darunterliegenden Befehl fort.

...zur Antwort