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

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

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

start /min notepad /p x:\test.txt

Ja, mit Notepad kann man tatsächlich drucken. Es öffnet sich zwar ein Fenster, dank /min aber minimiert. Sobald der Druckauftrag an den Drucker gesendet wurde, schließt es sich automatisch wieder.

...zur Antwort

Der FOR-Befehl wertet die Ausgabe des FINDSTR/N-Befehls aus. FINDSTR mit der Suchzeichenfolge "^" (als regulärer Ausdruck, ein einfacher Punkt geht auch) findet alle Zeilen in der Datei. Mit /N gibt es auch noch die zugehörige Zeilennummer aus.

Jetzt speichert es jede Zeile in die Variable "LetzteZeile". Bei jeder neuen Zeile wird jedoch der alte Wert der Variable "LetzteZeile" überschrieben, sodass letzten Endes nur die allerletzte Zeile gespeichert bleibt.

In dem FOR-Befehl sind allerdings zwei Fehler. Richtig lautet er

FOR /F "tokens=1,2 delims=:" %%i in ('findstr /n "^" "C:\Beispiel.txt') DO set LetzteZeile=%%j

Um eine beliebige Anzahl an Zeilen auszugeben, würde ich dieselbe Methode empfehlen. Allerdings muss man hierfür ermitteln, wie viele Zeilen die Datei hat. Deswegen muss man den FOR-Befehl zweimal nutzen.

set AnzahlAnzuzeigenderZeilen=5

FOR /F "tokens=1,2 delims=:" %%i in ('findstr /n "^" "C:\Beispiel.txt') DO set BisZeile=%%i

set /a AbZeile=%BisZeile% - %

AnzahlAnzuzeigenderZeilen% +1

FOR /F "tokens=1,2 delims=:" %%i in ('findstr /n "^" "C:\Beispiel.txt') DO if %%i GEQ %AbZeile% echo %%j

Mit der ersten Variable legst du fest, wie viele Zeilen angezeigt werden sollen. Hier habe ich mal "5" genommen. Der erste FOR-Befehl ermittelt, wie viele Zeilen die Zieldatei insgesamt hat. Der SET/A-Befehl errechnet die Zeilennummer, ab der geschrieben werden soll (z. B. bei 300 Zeilen gesamt ab Zeile 296 bis 300 = die 5 letzten Zeilen). Der zweite FOR-Befehl schreibt diese Zeilen.

Der IF-Befehl arbeitet im Sinne von "Wenn die aktuell ausgelesene Zeile größer oder gleich (Greater or EQual) %AbZeile% ist, schreib die Zeile".

...zur Antwort

Das geht mit dem CHOICE-Befehl. Auf Windows Vista und 7 gibt es den, ob auf 8.1, weiß ich nicht. Gib in CMD "choice /?" ein, dann bekommst du die entsprechenden Infos.

...zur Antwort
echo %date% | findstr "/" >nul 2>nul || set Sprache=Deutsch

if "%Sprache%" == "Deutsch" set Tag=%date:~0,2%
if "%Sprache%" == "Deutsch" set Monat=%date:~3,2%

if not "%Sprache%" == "Deutsch" set Tag=%date:~3,2%
if not "%Sprache%" == "Deutsch" set Monat=%date:~0,2%

set Jahr=%date:~5,4%

"findstr" sucht einen Schrägstrich im Datum. Falls der Befehl nicht erfolgreich ist ( || ) ist das Datum deutsch.

...zur Antwort

Ich verstehe nicht wirklich, warum du in jedem Fall "nicht erreichbar" in die Textdatei schreiben willst. Die Lösung zu deinem Problem ist aber "&&" und " || ".

Mit "&&" kannst du festlegen, welcher Befehl ausgeführt werden soll, falls der vorangegangene erfolgreich war.

Mit " || " kannst du festlegen, welcher Befehl ausgeführt werden soll, falls der vorangegangene NICHT erfolgreich war:

ping -n 2 -w 50 10.46.101.%n% && echo IP erreichbar: 10.46.101.%n% 1>ipaddresses.txt || echo Zielnetz nicht erreichbar.

Um die Ausgabe von PING zu unterdrücken, kannst du hinter das "%n%" bzw vor das "&&" noch ein "1>nul 2>nul" machen:

ping -n 2 -w 50 10.46.101.%n% >nul 2>nul && ...
...zur Antwort
@echo off
Setlocal EnableDelayedExpansion
set Counter=0
FOR /F "delims=" %%A IN ('dir /A /B /S "Pfad 1\*"') DO set /a Counter+=1
FOR /F "delims=" %%A IN ('dir /A /B /S "Pfad 2\*"') DO set /a Counter+=1
FOR /F "delims=" %%A IN ('dir /A /B /S "Pfad 3\*"') DO set /a Counter+=1
[...]
echo !Counter!
pause
exit
...zur Antwort

Schon lustig, wie sich hier die Profis damit brüsten, dass sie sehr erfahren in Batch seien, nur um dann zu sagen, dass sie keine Lösung haben.

Das geht mit Hilfe des FINDSTR-Befehls und des SET/P-Befehls.

Hier der Code einer Datei, die mehrere Farben in einem CMD-Fenster schreibt:

@echo off
:: Original author: Unknown
:: Editor: GrellesLicht28
REM To write a text before colored text, use a SET/P-command before the CALL-command.
REM To write a text between two colored texts, use a SET/P-command between two CALL-commands.
REM To write a text after all colored texts, use an ECHO-command. If you do not want to write anything after it, use "ECHO."
REM The last colored text should have "end" as third parameter.
title Colour Text
echo These are the colored texts:
echo.
call :ColorText 0a "GREEN"
set /p ".= " <nul
call :ColorText 0c "RED"
set /p ".= " <nul
call :ColorText 09 "BLUE"
set /p ".= " <nul
call :ColorText 0d "PINK"
set /p ".= " <nul
call :ColorText 0e "YELLOW"
set /p ".= " <nul
call :ColorText 08 "GRAY" end
echo.
echo.


set /p ".=Text before " <nul
call :ColorText 0a "GREEN"
set /p ".= and between green and " <nul
call :ColorText 0c "RED" end
echo. and after red.
echo.
echo.
pause
exit

:: Keep this label exactly as it is and do not change anything here!
:ColorText [%1 = Color] [%2 = Text]
set /p ".=." > "%~2" <nul 
findstr /v /a:%1 /R "^$" "%~2" nul 2>nul
set /p ".={BS}{BS}" <nul
if "%3" == "end" set /p ".=  {BS}{BS}" <nul
del "%~2" >nul 2>nul
exit /b

Gutefrage kann die {BS} nicht darstellen, die müssen mit Ascii-Code 08 ersetzt werden.

Zur Erklärung:

Die CALL-Befehle rufen die Schleife am Ende auf. Diese Schleife ist der Kern der Datei. Dazu komme ich gleich.

Die SET/P-Befehle zwischen CALL schreiben ein einzelnes Leerzeichen in die aktuelle Zeile, um die einzelnen Teile, die man in verschiedenen Farben schreiben will, zu trennen.

Der Mittelteil dient nur als Filler bzw. als Beispiel.

Nun die Schleife:

Zuerst erstellt das Programm eine Datei (SET/P-Befehl) mit dem Namen, den du in den CALL-Befehlen festlegst. Dieser Name ist der Text, der am Ende ausgegeben wird. "call :ColorText 0a "GREEN"" erstellt z.B. die Datei "GREEN". Mit Hilfe des Farbcodes 0a kommt grüne Schrift auf schwarzem Hintergrund raus.

Als nächstes durchsucht das Programm (FINDSTR-Befehl) die gerade erstellte Datei nach Code, welchen sie definitiv findet. Der Output dieses Befehls ist "Dateiname:Inhalt", in dem Beispiel "GREEN:.". Der Inhalt ist nur ein einziger Punkt.

Mit Hilfe des nächsten SET/P-Befehls gehen wir zwei Buchstaben in der aktuellen Zeile zurück (dazu dient das {BS} bzw. Backspace). Das erlaubt, dass man mit dem nächsten CALL-Befehl (also dem nächsten Aufruf der Schleife) den einzelnen Punkt und den Doppelpunkt (zwischen Dateiname und Inhalt) überschreibt als wären sie nie da gewesen.

...zur Antwort

Schreib vor jedes | ein ^

Dasselbe gilt auch für &-Zeichen. Bei manchen Symbolen kommt in CMD was anderes raus als in Notepad steht. Dagegen hilft CHCP 1250 oder eine Ascii-Tabelle für CMD.

Letztere findest du z.B. auf www.batchlog.pytalhost.com

...zur Antwort

Mehrere Zeilen in eine Variable zu speichern ist ziemlich aufwendig. Ich empfehle daher, mehrere nummerierte Variablen zu verwenden:

Setlocal EnableDelayedExpansion
set Counter=0
FOR /F "delims=" %%A IN ('dir /B') DO (
    set /a Counter+=1
    set Zeile!Counter!=%%A
)

Den Variableninhalt kannst du aufrufen mit

FOR /L %%A IN (1,1,!Counter!) DO echo !Zeile%%A!
...zur Antwort

Bei uns muss sich die EDV-Abteilung um alle mechanischen Probleme kümmern, die nicht mit dem Lager zu tun haben, sprich Drucker, Computer, Telefon im Sinne von Wartung, Einstellungen und Funktion.

Außerdem ist sie dafür verantwortlich, Software, die von Kollegen benutzt wird, so zu verändern, dass sie am leichtesten zu bedienen ist und alle nötigen Funktionen beinhaltet.

...zur Antwort

Nein, man kann nichts zu "Nichts" machen. Selbst wenn man Materie mit ihrer zugehörigen Antimaterie kollidieren lässt, entsteht dadurch Gammastrahlung, die wiederum ihre Energie hat.

...zur Antwort
Weitere Inhalte können nur Nutzer sehen, die bei uns eingeloggt sind.