2017-07-03 5 views
0

Ich versuche, eine Batch-Datei zu machen, die den Benutzer fragt, eine Mitarbeiter-ID und eine Menge an Geld, die sie möchten, dass besagte Mitarbeiter Gehalt durch erhöhen. Um dies zu tun, muss ich das Gehaltsfeld einer .txt-Datei nur für den Angestellten mit der ID ändern, die der Benutzer eingegeben hat. Unten ist der Code, den ich gerade verwende, aber ich kann nicht scheinen, irgendwo damit zu kommen, weil es gerade den Fehler ausspuckt. HierBatch-Datei Text bearbeiten

REM Prompt the user for the ID they wish to search 
set /p idSearch=Enter the employee's ID number: 
set /p raise=Enter the raise ammount: 
echo. 

REM Set the file to search 
set file="employees.txt" 

setlocal ENABLEDELAYEDEXPANSION 

for /f "tokens=1-5 delims=," %%i in (!file!) do (
if %%i=="ID: !idSearch!" (
set /a new_amount=%%s+!raise! 
echo ID: %%i FIRST: %%f LAST: %%l AGE: %%a Salary: $!new_amount! 
) else (
echo ERROR 
) 
) 
pause 

ist ein Beispiel dafür, was in der TXT-Datei ist:

ID: 20 FIRST: John LAST: Smith AGE: 30 SALARY: $20000

+0

Mit der Datenzeile, die Sie anzeigen, wird die gesamte Zeile '%% i' zugewiesen, da in der Zeile keine Kommas vorhanden sind. Wenn Sie die "delims" -Klausel entfernen, wird das Standard-Leerzeichen verwendet, und '%% i' erhält' ID: ',' ​​%% j' '20',' %% k' 'FIRST:' usw. Dies scheint nicht mit dem Echo zu harmonieren, das Sie verwendet haben. – Magoo

+0

Zusätzlich zum Kommentar und der Antwort von @Magoos gibt es keinen Währungsvariablentyp. Daher können Sie set/a nicht mit einer Zeichenfolge verwenden, die mit einem Dollarzeichen beginnt. Feldnamen in jeder Zeile Ihrer Datei zu haben ist furchtbar ineffizient. – LotPings

+0

@Magoo Ich habe es funktioniert jetzt dank Ihrer Hilfe, aber wenn ich versuche, es in die Textdatei zu speichern entfernt es alle anderen Mitarbeiter, die in der Datei sind. Haben Sie Vorschläge, wie Sie das beheben können? – Brett

Antwort

0

Seit file zitiert wird, müssen Sie die usebackq Option auf der for /f sonst wird es sein als eine von for /f zu analysierende Zeichenfolge betrachtet, keine Datei.

BTW - !var! wird nur benötigt, wenn sich der Wert der Variablen innerhalb eines Blocks ändern kann (z. B. mit einer Schleife). Wenn der Wert nicht ändern, verwenden %var% (zum Beispiel file im for /f, idsearch innerhalb des Blockes (aber es scheint nicht von dem entsandten Code initialisiert werden), aber nichtraise denn das ist vielfältig als Teil den Betrieb der Schleife.

ich Zitate halten aus Werte (für Dateinamen der Regel) zugeordnet sind, sondern wo die Anführungszeichen erforderlich sind (z. B. Dateinamen mit Leerzeichen), dann zitiere ich die Variable, zB "%filename%". dieses Regime nach kann einfacher sein,

0

Ich würde die einzigartige $ verwenden Zeichen als Trennzeichen:

@Echo Off 
Rem Enable Delayed Expansion 
SetLocal EnableDelayedExpansion 
Rem Set the file to search 
Set "file=employees.txt" 
Rem Exit if search file does not exist 
If Not Exist "%file%" Exit/B 
Rem Prompt the user for the ID they wish to update 
Set/P "id=Enter the employee's ID number: " 
Rem Search file for input ID 
For /F "Tokens=1* Delims=$" %%A In ('Find "ID: %id% "^<"%file%"') Do (
    Rem Show the user the current salary value 
    Echo Current Salary for ID %id% is $%%B 
    Rem Prompt the user for the new raise amount 
    Set/P "raise=Press Enter to accept or Type an increase amount: " 
    Rem Supplement 0 raise for empty amount 
    If Not Defined raise Set "raise=0" 
    Rem Calculate new salary based on raise 
    Set/A "new_amount=raise+%%B" 
    Rem Output line with resultant salary 
    Echo %%A $!new_amount! 
) 
Timeout -1 
GoTo :EOF 

Sie können die kommentierten Zeilen natürlich entfernen.

bearbeiten

Hier ist eine Version, die in eine neue Datei schreibt. Ich fühle mich großzügig ...

@Echo Off 
SetLocal EnableDelayedExpansion 
Set "file=employees.txt" 
If Not Exist "%file%" Exit/B 
Set/P "id=Enter an employee ID number: " 
If Not Defined id Exit/B 
Set/P "amount=Enter new raise increase: " 
If Not Defined amount Set "amount=0" 
(For /F "UseBackQDelims=" %%A In ("%file%") Do (Echo=%%A|Find "ID: %id% ">Nul&&(
    For /F "Tokens=1* Delims=$" %%B In ("%%A") Do (Set/A "amount+=%%C" 
     Echo=%%B$!amount!))||Echo=%%A))>updated.txt 

diesmal ohne die Kommentare.

Bitte haben Sie Verständnis dafür, dass wenn das Layout Ihrer Suchdatei sich ändert, diese Skripte möglicherweise nicht funktionieren!

+0

Dies funktioniert, aber wenn es andere Mitarbeiter in der Textdatei gibt, entfernt es sie und hinterlässt nur den Angestellten, der sein Gehalt geändert hatte – Brett

+0

Nein, es ist nicht mein Skript nur eine Zeile an die Konsole; etwas, das du geändert hast, hat dieses Problem verursacht. _Bestätigt ist, dass Sie 'Echo %% A $! Neue Menge!' In eine Datei umgeleitet haben._ – Compo

+0

Ja, der ganze Sinn der Datei besteht darin, das Gehalt, das sich dort befindet, durch das neue zu ersetzen. Entschuldigung, wenn ich das früher nicht erwähnte. Also habe ich es so eingestellt, dass es in eine .tmp-Datei ausgegeben und dann in die employees.txt-Datei kopiert wird. – Brett

Verwandte Themen