Die gerade verwendete Zeile löschen
Hallo zusammen
Zu meinem Problem
Ich habe ein Script, welches in einem CSV nach dem Servernamen sucht. Dies wird mittels For Schleife gemacht. Diese geht ja bekanntlicherweise von unten nach oben um einen String zu suchen.
Nachdem der Servername gefunden wurde, werden die einzelnen angaben "eingelesen".
Da das Script nun einen Loop machen muss (bis der Servername nicht mehr vorhanden ist) muss ich jetzt diese Zeile, die ich gerade auch verwendet habe, löschen. NUR diese.
Wie mach ich das nun am Besten?
Der Aufbau des CSVs sieht wie folgt aus:
Server1;21.12.2012;12:00;Programm1;\\Server\Software$\Software\Source
Server1;21.12.2012;12:00;Programm2;\\Server\Software$\Software\Source2
Server1;21.12.2012;12:00;Programm3;\\Server\Software$\Software\Source1
Server2;21.12.2012;12:00;Programm1;\\Server\Software$\Software\Source
Server2;21.12.2012;12:00;Programm2;\\Server\Software$\Software\Source2
Grüsse
Aivilon
Zu meinem Problem
Ich habe ein Script, welches in einem CSV nach dem Servernamen sucht. Dies wird mittels For Schleife gemacht. Diese geht ja bekanntlicherweise von unten nach oben um einen String zu suchen.
Nachdem der Servername gefunden wurde, werden die einzelnen angaben "eingelesen".
Da das Script nun einen Loop machen muss (bis der Servername nicht mehr vorhanden ist) muss ich jetzt diese Zeile, die ich gerade auch verwendet habe, löschen. NUR diese.
Wie mach ich das nun am Besten?
Der Aufbau des CSVs sieht wie folgt aus:
Server1;21.12.2012;12:00;Programm1;\\Server\Software$\Software\Source
Server1;21.12.2012;12:00;Programm2;\\Server\Software$\Software\Source2
Server1;21.12.2012;12:00;Programm3;\\Server\Software$\Software\Source1
Server2;21.12.2012;12:00;Programm1;\\Server\Software$\Software\Source
Server2;21.12.2012;12:00;Programm2;\\Server\Software$\Software\Source2
Grüsse
Aivilon
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 186084
Url: https://administrator.de/contentid/186084
Ausgedruckt am: 18.11.2024 um 03:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo aivilon!
Magst Du nicht einfach kurz beschreiben, was der Batch tatsächlich leisten soll?
Grüße
bastla
Ich habe ein Script, welches in einem CSV nach dem Servernamen sucht. Dies wird mittels For Schleife gemacht.
Warum nicht per "findstr
" (damit ließe sich auch das Löschen erledigen)?Diese geht ja bekanntlicherweise von unten nach oben um einen String zu suchen.
???Magst Du nicht einfach kurz beschreiben, was der Batch tatsächlich leisten soll?
Grüße
bastla
Hallo aivilon!
Wozu löschen bzw wozu einzelne Zeilen löschen? Wenn schon sollte es doch genügen, alle Zeilen für einen bestimmten Server am Stück zu löschen, also etwa:
Falls aber wirklich jede einzelne Zeile weg soll, könntest Du vorweg die gesamte Zeile einlesen, dann erst zerlegen und dann die Zeile als Suchbegriff verwenden - ungetestet:
BTW: Wozu werden eigentlich die "Tokens" Variablen zugewiesen?
Grüße
bastla
Wozu löschen bzw wozu einzelne Zeilen löschen? Wenn schon sollte es doch genügen, alle Zeilen für einen bestimmten Server am Stück zu löschen, also etwa:
move "%srvList%" "%temp%\srvList"
findstr /vbic:"%Host%%Delim%" "%temp%\srvList">"%srvList%"
for /f "delims=" %%i in ('findstr /bic:"%Host%%Delim%" "%srvList%"') do (
for /f "tokens=1-5 delims=%Delim%" %%a in ("%%i") do (
set "srvName=%%a"
set "srvDate=%%b"
set "srvTime=%%c
set "srvSoft=%%d"
set "srvPath=%%e"
)
REM Verarbeitung
REM
REM Verarbeitung Ende
move "%srvList%" "%temp%\srvList"
findstr /vxc:"%%i" "%temp%\srvList">"%srvList%"
)
Grüße
bastla
Hallo aivilon!
Würde ich eher so versuchen (ungetestet):
Falls Dir der Eintrag
Grüße
bastla
Würde ich eher so versuchen (ungetestet):
@echo off & setlocal enabledelayedexpansion
set "DeployPath=\\[SERVER]\Software$\"
set "SoftCSV=
set "srvList=%DeployPath%\Software\installsoft.csv"
set "Delim=;"
set "Host=%computername%"
set "Log=%DeployPath%\Log\Log.log"
>>"%Log%" echo.
for /f "tokens=1-5 delims=%Delim%" %%a in ('findstr /b /i /c:"%Host%%Delim%" "%srvList%"') do (
set "srvName=%%a"
set "srvDate=%%b"
set "srvTime=%%c"
set "srvSoft=%%d"
set "srvPath=%%e"
echo 1. !srvName! 2. %Host%
REM echo 1.) !srvDate! 2.) !srvTime!
if !srvDate!==0 set "srvDate=!date!"
if !srvTime!==0 set "srvTime=!time!"
REM echo 1.) !srvDate! 2.) !srvTime!
for /f "tokens=1-4 delims=:., " %%i in ("!srvTime!") do set srvTime=%%i:%%j:00
for /F "tokens=1,2,3 delims=., " %%i in ("!srvDate!") do (
Set "Month=%%i"
Set "Day=%%j"
Set "Year=%%k"
SET "srvDate=%%j/%%i/%%k"
)
REM echo 1.) %Month% 2.) %Day%
if !Month:~,1!==0 set "Month=!Month:~1,1!"
if !Day:~,1!==0 set "Day=!Day:~1,1!"
REM echo 1.) %Month% 2.) %Day%
REM echo .!srvSoft!.
REM echo .!srvDate!.
REM echo .!srvTime!.
schtasks /create /TN "SoftwareUpdate\!srvSoft!" /tr !srvPath!\!srvSoft!.msi /SC ONCE /ST !srvTime! /sd !srvDate!
>>"%Log%" ECHO.
>>"%Log%" ECHO Task wurde erstellt:
>>"%Log%" ECHO schtasks /create /TN "SoftwareUpdate\!srvSoft!" /tr !srvPath!\!srvSoft!.msi /SC ONCE /ST !srvTime! /sd !srvDate!
>>"%Log%" ECHO Programm: !srvSoft!
>>"%Log%" ECHO Datum und Zeit: !srvDate!, !srvTime!
>>"%Log%" ECHO Task ist unter: SoftwareUpdate\!srvSoft! zu finden
)
move "%srvList%" "%temp%\srvList"
findstr /vbic:"%Host%%Delim%" "%temp%\srvList"">"%srvList%"
>>"%Log%" ECHO Log vom: %Date% um %time%
>>"%Log%" ECHO #########################
>>"%Log%" ECHO.
Exit
Es gibt keine zu installierende Software für %Host%
wichtig sein sollte, kannst Du vor Zeile 11 einfügen:findstr /bic:"%Host%%Delim%" "%srvList%">nul||>>"%Log%" ECHO Es gibt keine zu installierende Software für %Host%
bastla
Hallo aivilon!
Ist natürlich auch eine Möglichkeit ...
Die Zeile 67 ist übrigens nicht nur überflüssig, sondern kontraproduktiv.
BTW: Die Zeilen 44 und 47 haben bisher auch nur darum zu keinem Fehler (wegen des enthaltenen "
Grüße
bastla
Ist natürlich auch eine Möglichkeit ...
Die Zeile 67 ist übrigens nicht nur überflüssig, sondern kontraproduktiv.
BTW: Die Zeilen 44 und 47 haben bisher auch nur darum zu keinem Fehler (wegen des enthaltenen "
do
") geführt, weil die Abfragen ohnehin nicht so funktioniert, wie Du es vermutlich vorhattest, und die Zeile 28 dürfte eigentlich nur dann zu einem Sprung führen, wenn aufgrund von Unterschieden durch Groß-/Kleinschreibung die Abfrage in der Zeile 27 nicht funktioniert (ansonsten muss immer %srvName% mit "%host% übereinstimmen, da ansonsten die Zeile gar nicht erst gefunden/die Schleife nicht durchlaufen worden wäre ...Grüße
bastla
Hallo aivilon!
Grüße
bastla
if %Day%==0* set Day=%Day:~1,1%
Soferne Du damit, wie ich vermute, erreichen willst, dass eine führende Null entfernt wird, schau Dir meinen Ansatz dazu an (Zeile 33) - Deine Abfrage kann so nicht funktionieren, da Wildcards beim Vergleich mit "==
" nicht unterstützt werden ...Jop, das mit der Gross klein schreibung muss ich noch machen.
Das ist zwar nur ein "/i
", aber eigentlich sind beide Abfragen unnötig, da ja aufgrund des "findstr
" die Schleife ohnehin nur für jene Zeilen durchlaufen wird, an deren Anfang der Inhalt von "%host%" steht (sodass es niemals einen Sprung zu ":Endofdeploy" geben dürfte) ...Grüße
bastla
Hallo aivilon!
Grüße
bastla
Und danach kommt es zum goto Endofdeploy.
Das ist richtig, aber diesen Sprung hatte ich auch nicht gemeint, sondern nur jenen in Zeile 28 ...Wie kann ich den Task so setzten, dass der Task mit "Run Wheter User is logged in or not" konfiguriert ist?
Indem Du ihn über das Systemkonto (mit dem Schalter "/RU
") ausführen lässt?Grüße
bastla