Toon posts:

[DOS] Copy line/character

Pagina: 1
Acties:

Verwijderd

Topicstarter
Halloow allemaal... ik zit met een probleempje.
Ik wil graag een batch file aanmaken die een .txt leest en daaruit een paar regels dumpt in een een nieuwe .txt file, hierbij wordt ook een externe .txt in het totale bestandje gedumpt.
Het steekt zo in elkaar:

test.txt
-------------------
Nummer Path
12345 c:\12345.txt
67890 c:\67890.txt

De nummers worden gelezen, daarna de inhoud van de txt file die daarbij hoort. Dan komt de volgende regel met nummer en bijbehorende txt bestand. Dit samen word dan gedumpt in een nieuw txt bestand.

Dit is wat ik had en niet werkte :(
copy test.txt"12345"+c:\12345.txt+"67890"+c:\67890.txt totaal.txt

Iemand enig id ?

  • Arnaud
  • Registratie: Mei 2000
  • Laatst online: 28-02 22:22
FOR /?
(lees het gedeelte over IN eens goed door)

Verwijderd

Topicstarter
Lukt nog niet ... |:(
iemand verdere suggesties?

[ Voor 76% gewijzigd door Verwijderd op 29-03-2004 14:15 ]


Verwijderd

met een for loop kan dit, dus ga ff prutsen...

Verwijderd

je blijft vaag..
echo. > output.txt
for %%x in ( 12345 67890 ) do type %%x.txt >> output.txt

maar als je input uit een bestand wil halen is het beter met 4DOS of bijvoorbeeld de CMD.exe van windowsNT/2000/XP te werken.
die kunnen beter omgaan met tekst IN bestanden

  • ajouin
  • Registratie: Juli 2001
  • Laatst online: 20-11-2025
zoiets?

type test.txt | find "12345" >>totaal.txt
type c:\12345.txt >>totaal.txt
type test.txt | find "67890" >>totaal.txt
type c:\67890.txt >> totaal.txt

Verwijderd

Topicstarter
Ajouin, ja dat is m bijna! :)

Ik zal het even iets verduidelijken. Het gaat om een hoop bestanden.
Ik heb een order.txt (dat was dus even mn test.txt)
In dat order.txt staan een aantal artikelnummers (12345 en 678980) in werkelijkheid zijn dit er een stuk of 15 en deze bestaan uit meer dan alleen cijfers.
Na dit artikelnummer staat er een pad aangegeven (c:\12345.txt) in deze file staat een hoop informatie over het betrefende artikelnummer.
De bedoeling is nu om de Order.txt uit te lezen en dan moet hij de artikel nummers in een total.txt zetten met ONDER het artikelnummer de inhoud van het bijbehorende txt filetje...
Knap lastig dus...

het zou er dus zo uitmoeten zien:
total.txt
--------------------------------------------------------------------------
12345
dan staat hier de informatie uit het bestand 12345.txt
67890
en hier moet dan ook de informatie komen te staan uit het bestand 67890.txt
--------------------------------------------------------------------------

en omdat dus automatisch te laten gaan wil ik dus eigenlijk iets bouwen zodat hij van elke "line" de 1e 5 characters gaan lezen, dit in total.txt dumpt en het bijbehorende txt filetje er ook instopt.

Het schijnt mogelijk te zijn,.. ik zie het niet... daarom vraag ik jullie om hulp.
Dank u allen! _/-\o_

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

offtopic:
Je zegt steeds dat FOR niet werkt of bijna werkt --> het lijkt me dan handig om de documentatie ervan goed te lezen (in ook de SA FAQ staan er wat links over) en zelf een volgende poging te wagen, het lijkt me niet dat de GoTters alles voor je moeten voorkauwen ;)

Je kunt misschien wat met de delimiters in FOR i.c.m. een tweede batch file die ales na de eerste spatie verwerkt. Anders zou je kunnnen kijken naar een 'taal' waar je wat meer mee kunt, een VBScript kan dit prima en is goed in een (Windows) batch aan te roepen met cscript.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Verwijderd

Topicstarter
Hehe ik w8 er ook niet op om alles voor te kouwen... (zou wel handig zijn O-) )
Maar tip zijn altijd welkom/handig. Ik check die links wel ff, thx!

maar snap geen ene hout van FOR
(ik heb nogal moeite met logica)

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:11

Reptile209

- gers -

FOR is niet zo heel complex hoor.
code:
1
for %%x in ( 12345 67890 ) do type %%x.txt >> output.txt
doet het volgende: Tussen haakjes staat een aantal stappen (in dit geval 2 stuks). De lus wordt voor iedere stap doorlopen, waarbij de variabele %%x de waarde van die stap krijgt. Dus stap 1: %%x=12345, stap 2: %%x=67890, einde.
Tijdens iedere stap wordt uitgevoerd wat achter de "do" staat.
sim-pel :)

Zo scherp als een voetbal!


Verwijderd

Topicstarter
K dat is al een stuk duidelijker dan die idiote FOR /?
begreep der geen hout van, dank u.

Dus dan zou ik iets moeten hebben zoals:
code:
1
for %%x in ( line1,character1to5 ) do type %%x.txt >> output.txt

want zolang ik die "line1,character1to5" en de next lines niet automatisch een waarde aan kan laten nemen heb ik nog niks. Ik moet dan nu iedere keer 12345 en 67890 invoeren en DAT is wat ik dus automatisch wil laten lopen.
Is er verder geen extra commando die ik kan laten zoeken op lines en characters?

:) ik begrijp FOR iig nu...


edit
Commando "FINDSTR" (denk dat het hier mee gaat lukken)
Regular expression quick reference:
. Wildcard: any character
* Repeat: zero or more occurances of previous character or class
^ Line position: beginning of line
$ Line position: end of line
[class] Character class: any one character in set
[^class] Inverse class: any one character not in set
[x-y] Range: any characters within the specified range
\x Escape: literal use of metacharacter x
\<xyz Word position: beginning of word
xyz\> Word position: end of word
/edit

[ Voor 110% gewijzigd door Verwijderd op 30-03-2004 13:00 ]


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Met een test.txt
-------------------
Nummer Path
12345 c:\12345.txt
67890 c:\67890.txt

kan je toch gewoon iets als dit doen:
for /F "tokens=1,2" %i in (order.txt) do bla.cmd %i %j
en die bla.cmd doet dan iets als
echo %1 >> total.txt
type %2 >> total.txt

En inderdaad moet je misschien een uurtje met for spelen om het te begrijpen :)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Verwijderd

Topicstarter
Ok dus als ik het (token) goed begrijp, zit dat dus zo in elkaar:
code:
1
2
Pinging   REMOTE_PC [10.100.0.14] with 32 bytes of data: 
token=1   token=2   token=3       4    5  6     7  8


tokens=x,y,m-n
bepaald welke tokens van elke regel worden doorgegeven aan de FOR tekts voor elke iteratie. hierdoor worden extra variabe namen toegewezen. De vorm m-n is een bereik, waarmee de m-de t/m n-de tokens worden bepaald. Als het laatste teken in de tekenreeks tokens= een * is, wordt een extra variable toegewezen en wordt de resterende tekst ontvangen op de regel na de laatste verdeelde token.
edit
x=1 token1=Pinging
y=2 token2=REMOTE_PC
m-n (als dit * zou worden begint x weer op een nieuwe regel?)
m-n (als dit 3-5 zou de volgende token op "bytes" beginnen?)
/edit

[ Voor 3% gewijzigd door Verwijderd op 30-03-2004 14:14 ]


Verwijderd

F_J_K schreef op 30 maart 2004 @ 13:46:
Met een test.txt
-------------------
Nummer Path
12345 c:\12345.txt
67890 c:\67890.txt

kan je toch gewoon iets als dit doen:
for /F "tokens=1,2" %i in (order.txt) do bla.cmd %i %j
en die bla.cmd doet dan iets als
echo %1 >> total.txt
type %2 >> total.txt

En inderdaad moet je misschien een uurtje met for spelen om het te begrijpen :)
beetje omslachtig :)

for /f "tokens=*" %%i in (order.txt) do echo %%i >> total.txt

doet precies wat tie vraagt.

edit: ummm nvm niet helemaal goed gelezen dus :)

[ Voor 9% gewijzigd door Verwijderd op 30-03-2004 15:15 ]


Verwijderd

Verwijderd schreef op 30 maart 2004 @ 15:13:
[...]


beetje omslachtig :)

for /f "tokens=*" %%i in (order.txt) do echo %%i >> total.txt

doet precies wat tie vraagt.

edit: ummm nvm niet helemaal goed gelezen dus :)
for /f "tokens=1,2*" %%i in (c:\order.txt) do (
echo %%i >> total.txt
copy /b total.txt+%%i.txt total.txt
)

[ Voor 12% gewijzigd door Verwijderd op 30-03-2004 15:22 ]


Verwijderd

Topicstarter
w000t! het werkt! _/-\o_
bedankt voor alle alle hulp!

en nu gaan we kijken of ik dit in een groter geheeld voor elkaar krijg ;)

Verwijderd

Verwijderd schreef op 30 maart 2004 @ 15:49:
w000t! het werkt! _/-\o_
bedankt voor alle alle hulp!

en nu gaan we kijken of ik dit in een groter geheeld voor elkaar krijg ;)
welke oplossing is nu de werkende?

en wat wil je nog meer in elkaar klussen?

Verwijderd

Topicstarter
Die van jou werkt 100%
Ik had vanmiddag zelf ook als iets inelkaar gefrutseld wat ook werkte maar niet 100%

Nu de practijk... :| heb alweer een probleem gevonden.
Dit is een order waar ik dus mee moet werken.
efbstfr2.txt
------------------------------------
579H5001 q:\imtext\579\579h5001.txt
580H0636 q:\imtext\580\580h0636.txt
580H1377 q:\imtext\580\580h1377.txt
646S1153 q:\imtext\646\646s1153.txt
580H0716 q:\imtext\580\580h0716.txt
580H1387 q:\imtext\580\580h1387.txt
652H0151 q:\imtext\652\652h0151.txt
706H0061 q:\imtext\706\706h0061.txt
------------------------------------

579H5001 q:\imtext\579\579h5001.txt
Dit is dus een probleem...
code:
1
echo q:\imtext\%%i.txt >> total.txt
kan dus niet meer. omdat er nog weer een subdir aanhangt.
nou zou ik dus de 1e 3 cijfers van de token er ook nog tussen moeten plaatsten, ik weet alleen niet of dit kan.
(ik ga nu naar huis ;) eindelijk vrij zo... ill continue tomorrow)
btw. ik vind dit trouwens best leuk om deze dingetjes te spelen. thx again!

Verwijderd

Verwijderd schreef op 30 maart 2004 @ 16:50:
Die van jou werkt 100%
Ik had vanmiddag zelf ook als iets inelkaar gefrutseld wat ook werkte maar niet 100%

Nu de practijk... :| heb alweer een probleem gevonden.
Dit is een order waar ik dus mee moet werken.
efbstfr2.txt
------------------------------------
579H5001 q:\imtext\579\579h5001.txt
580H0636 q:\imtext\580\580h0636.txt
580H1377 q:\imtext\580\580h1377.txt
646S1153 q:\imtext\646\646s1153.txt
580H0716 q:\imtext\580\580h0716.txt
580H1387 q:\imtext\580\580h1387.txt
652H0151 q:\imtext\652\652h0151.txt
706H0061 q:\imtext\706\706h0061.txt
------------------------------------

579H5001 q:\imtext\579\579h5001.txt
Dit is dus een probleem...
code:
1
echo q:\imtext\%%i.txt >> total.txt
kan dus niet meer. omdat er nog weer een subdir aanhangt.
nou zou ik dus de 1e 3 cijfers van de token er ook nog tussen moeten plaatsten, ik weet alleen niet of dit kan.
(ik ga nu naar huis ;) eindelijk vrij zo... ill continue tomorrow)
btw. ik vind dit trouwens best leuk om deze dingetjes te spelen. thx again!
for /F "tokens=1,2*" %%a in (efbstfr2.txt) do (
echo %%a >>totals.txt
copy /b totals.txt + %%b totals.txt
)

give if a try

Verwijderd

Topicstarter
for /F "tokens=1,2*" %%a in (efbstfr2.txt) do (
echo %%a >>totals.txt
copy /b totals.txt + %%b totals.txt
)
Met: copy /b totals.txt + %%b.txt totals.txt
lukt het wel :) _/-\o_

Verwijderd

Topicstarter
K dit is wat ik nu gecreerd heb, met alle hulp ;)
code:
1
2
3
4
5
6
for /F "tokens=1,2*" %%a in (c:\dos\efbstfr2.txt) do (
echo %%a >>total.txt
copy /b total.txt+line.txt+%%b.txt+line.txt total.txt
)
copy c:\DOS\total.txt LPT1
del c:\dos\total.txt


Voorbeeld van het resultaat:
579H5001
===========================================================================
Versie A, dd.

Specificatie:
---------------------------------------------------------------------------
Type SKHSM 9010 Eco Plus
Spoorbreedte: 2040 mm
Hoh veren: 1200 mm
Schijfrem SB 3745
1-blads veer 1x56; L2= 380 mm
Volgens BPW ALII-SN.0 blz. 15
Inclusief wielmoerset middencentrering

Maximale toleranties op uitlijning veren/as volgens tek. 082T0032(A).
As midden/voor uitgevoerd met bevestigingsmogelijkheid luchtveerventielstang.

===========================================================================
580H0636
===========================================================================
Versie A, dd.:

Aslift vlgs. BPW tekening SL-9312.0 blad 19a
Veerhand LST maat: 268 mm (BPW art. 05.375.67.03.0 met bovenplaat=oud model)
BPW 30K balg met lange pot(180 mm)
===========================================================================
580H1377
===========================================================================
Versie A, dd.:

Specificatie:
---------------------------------------------------------------------------
Type HSM ALU V30/270-300
Volgens ALII-SN(B).0 blad 15
V-maat 0/20/60; Balg V30

Inhoud verzamelgroep ophanging:
- veerbevestigingsmateriaal
- veerhanden worden per 01-01-2003 uit Pacton voorraad aangestuurd.
- schokdempers + bevest.materiaal
- luchtveerbalgen + bevest.materiaal.
Netjes dacht ik toch :)
Er is nog 1 ding dat ik er nog in wil hebben en dat is een Invoer opgeven.

echo Geef de naam van het bestand op:
deze dus bv. de waarde %1 geven (weet niet welke code ik moet gebruiken om iets in te voeren :?)
c:\dos\efbstfr2.txt %1 laten worden.

hoe doe ik dit? iedere keer als ik iets probeer sluit hij de batch... ik kan er wel een pause inzetten maar dan heb nog geen invoer...
(hulp welkom)

  • Arnaud
  • Registratie: Mei 2000
  • Laatst online: 28-02 22:22
set /p eigeninput=type iets:
echo %eigeninput%

Verwijderd

[.cmd]
set /p output=

for /F "tokens=1,2*" %%a in (efbstfr2.txt) do (
echo %%a >>%output%.txt
copy /b %output%.txt + %%b.txt %output%.txt
)
[/.cmd]

zoiets moet t dan worden.

[ Voor 9% gewijzigd door Verwijderd op 07-04-2004 10:02 ]


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
cls
echo ========================
echo Geef de bestandsnaam op:
echo ========================
set /p input=
for /F "tokens=1,2*" %%a in (%input%) do (
echo %%a >>output.txt
copy /b output.txt+line.txt+%%b.txt+line.txt output.txt
)
copy output.txt LPT1
del output.txt
cls
echo ============================
echo De bijlage wordt nu geprint!
echo ============================


Het werkt! _/-\o_
Er wordt gevraagd naar het bestand, wordt geopend, dumpt alles in 1 file en print m.
Zo ongelooflijk veel bedankt allemaal!

Mission Complete, Topic kan oplsot :*)

[ Voor 3% gewijzigd door Verwijderd op 09-04-2004 14:15 ]


Verwijderd

Topicstarter
Middag iedereen, de batch moet weer worden uitgebeid en ik is hulp nodig :)
Ik ben 2 dingen nodig:
- een regel teller (elke pagina moet een paar blanke regels hebben, ivm een logo bovenaan)
- een van / tot gedeelte

Het is de bedoeling om een reeks oders erdoor heen te rammen. Dit zijn er teveel om met de hand te doen. Voorbeeld: van 24500.txt tot 24750.txt. Om 250x de batch uit te voeren wordt je ook een beetje knetter van lijkt me.

Is er een mogelijkheid om 2 verschillende %setinput% 's te maken?
en met een ">" een
code:
1
 if %setinput1% < %setinput2% do "de batch die gemaakt is"


Dat met die regelteller heb ik helemaal geen id van hoe dat zou moeten... :|

Verwijderd

Topicstarter
Niemand?
Ik kom der nog steeds niet uit...

Is er iemand die wat voorbeelden kan geven hoe je dit zou kunnen doen?

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Misschien dat je een regel teller voor elkaar krijgt met een geneste FOR loop oid, maar ik zou het afraden. Niet wat je wilt horen na jezelf zo in DOS batches te hebben ingewerkt, maar misschien is het handiger om over te stappen op iets dat wat meer (eenvoudige) flexibiliteit heeft; cscript (de commandline aanroep van WSH / VBScript of JScript).

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Verwijderd

Topicstarter
Ja ik heb ook het id dat je daarin meer berijkt...
Maar toch zou het wel in DOS moeten kunnen.
VB en dergelijke heb ik helemaal geen verstand van...
Ik pruts vrolijk verder, maar ideen en hints zijn welkom :D

Verwijderd

Topicstarter
Kun je in DOS net zo rekenvaardig bezig gaan als in bv. Pascal?
bv. als je moet beginnen met Order1 dat je dan Order1 + 1 kan doen? Resultaat Order2?

Als dit mogelijk is kan ik wel een Loop+1 Until %setinput1% > %setinput2% doen... Zal wel niet mogelijk zijn...

Die counter dat gaat helemaal niet lukken denk ik... ik vind dat ze dat maar op blanco papier gaan afdrukken... ik vind het zo al lastig genoeg.

Verwijderd

wat je nu precies wil is me niet duidelijk maar zo maak je een loopje...

code:
1
2
3
4
5
6
7
8
9
10
set count=0

:loop
echo %count%
set /a count +=1
if %count%==10 goto exitloop
goto loop

:exitloop
echo einde loop


wat je met regelteller bedoelt is me ook onduidelijk, maar als je een paar blanco regels in je outputfile wil hebben moet je gewoon een blanco regel echo-en aka:

echo. >>output.txt

[ Voor 35% gewijzigd door Verwijderd op 17-05-2004 17:28 ]


Verwijderd

Topicstarter
leeg

[ Voor 112% gewijzigd door Verwijderd op 18-05-2004 12:33 ]


Verwijderd

Topicstarter
leeg

[ Voor 99% gewijzigd door Verwijderd op 18-05-2004 12:33 ]


Verwijderd

Topicstarter
Sorry dat ik hier zo ontzettend aan het prutsen! ben. Ik wil nu alleen even duidelijkheid scheppen over wat nu het doel is.

Dit is de batch tot zover:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
cls
set txt=.txt
echo =======================
echo Geef het Ordernummer op:
echo =======================
set /p start=
for /F "tokens=1,2*" %%a in (%start%%txt%) do (
echo %%a >>output.txt
copy /b output.txt+line.txt+%%b.txt+line.txt output.txt
)
notepad /p C:\Documents and Settings\Administrator.PACTON\Bureaublad\Verkoop Batch\output.txt
cls
echo ============================
echo De bijlage wordt nu geprint!
echo ============================
pause
exit


Dit is het resultaat.
579H5001
---------------------------------------------------------------------------
Versie A, dd.

Specificatie:
---------------------------------------------------------------------------
Type SKHSM 9010 Eco Plus
Spoorbreedte: 2040 mm
Hoh veren: 1200 mm
Schijfrem SB 3745
1-blads veer 1x56; L2= 380 mm
Volgens BPW ALII-SN.0 blz. 15
Inclusief wielmoerset middencentrering

Maximale toleranties op uitlijning veren/as volgens tek. 082T0032(A).
As midden/voor uitgevoerd met bevestigingsmogelijkheid luchtveerventielstang.

---------------------------------------------------------------------------
580H0636
---------------------------------------------------------------------------
Versie A, dd.:

Aslift vlgs. BPW tekening SL-9312.0 blad 19a
Veerhand LST maat: 268 mm (BPW art. 05.375.67.03.0 met bovenplaat=oud model)
BPW 30K balg met lange pot(180 mm)
---------------------------------------------------------------------------
Het is nu de bedoeling dat:
de batch een reeks ordernummers automatisch doet.
Dus niet handmatig invoeren, Ordernummer 123100 tot 123150. <- dit wil ik dus automatisch laten gaan.

Mijn id zelf was om een %start% en een %end% op te geven. De %start% iedere keer +1 te geven en de batch uit te laten voeren totdat %end% bereikt is. Dit lukt mij al niet |:(
%start% =dan 123100
%end% =dan 123150
alles nu achter elkaar laten lezen, dumpen en printen...


Bijzaak:
Is er nog een mogelijkheid in Notepad de %start% als header mee te geven?
Hij krijgt namelijk nu iedere keer Output.txt bovenaan de pagina.
Het zou wel fijn zijn als de Ordernummers er ook op komen te staan.

Verwijderd

Topicstarter
Kleine Update :)
Het notepad probleem heb ik al opgelost.

Regedit:
szHeader = Order Nummer: &F

Order bestandje
112233.txt (inhoud)
---------------------------------
579H5001 q:\imtext\579\579h5001
580H0636 q:\imtext\580\580h0636

Batch nu:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off
cls
set txt=.txt
echo =======================
echo Geef het Ordernummer op:
echo =======================
set /p start=
for /F "tokens=1,2*" %%a in (%start%%txt%) do (
echo %%a >>output.txt
copy /b output.txt+line.txt+%%b.txt+line.txt output.txt
)
copy output.txt c:\dump\%start%.txt
del /q output.txt
notepad /p c:\dump\%start%.txt
del /q c:\dump\%start%.txt
cls
echo ============================
echo De bijlage wordt nu geprint!
echo ============================
pause
exit


Resultaat:
Order Nummer: 112233.txt

579H5001
----------------------------------------
Versie A, dd.

enz. enz. enz.
8) ik leer het nog wel

Verwijderd

usage: batch [startorder] [endorder]

if "%1"=="" goto error
if "%2"=="" goto error
set start=%1
set end=%2

:loop
doe je ding
if %end%==%start% goto end
set /a start+=1
goto loop

:error
echo invalid input arguments
echo usage: batchname [startorder] [endorder]

:end

edit: je kan gewoon echo-en naar %start%.txt maakt je output.txt overbodig

[ Voor 41% gewijzigd door Verwijderd op 18-05-2004 13:18 ]

Pagina: 1