Toon posts:

[TP] Hoe een errorlevel teruggeven aan batch file?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben opzoek naar een klein stukje code maar dit schijnt nogal moeilijk te zijn; wat ik zoek is simpel. Het stukje code moet een errorlevel terug kunnen geven aan een batch file bij exit van het programma.

Nu heb ik al een heel klein TP source code waarmee ik een driveletter kan achter halen die door MSCDEX is aangemaakt (cdromletter dus) en wil deze als errorlevel teruggeven aan een batch bestand zodat ik automatisch kan detecteren welke cdrom drive(s) er zijn.

Gezocht heb ik via google, yahoo en dergelijke sites maar kan helaas niets vinden waarmee ik dus errorlevels kan 'genereren', echter had ik wel wat zaken gezien in assembler maar helaas is mijn kennis beperkt tot een scherm op resolutie 13 zetten :P (320x200?) :D

Heeft iemand misschien een idee hoe dit in zijn werk gaat?

[ Voor 5% gewijzigd door Verwijderd op 24-11-2004 20:24 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Bedoel je met TP Turbo Pascal? Werkt het niet door onderaan je hoofdcode dit op te nemen?
Delphi:
1
result := 1;

[ Voor 10% gewijzigd door NMe op 24-11-2004 20:35 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Hmmm... was dat niet gewoon

Delphi:
1
  Exit(5); { Waarbij 5 dus je exit code cq. errorlevel is... (duhhhh :P) }


?

Ik zal eens ff Googlen, want er moet toch wel iets over te vinden zijn.

[ Voor 21% gewijzigd door Verwijderd op 24-11-2004 20:43 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

halt

The Halt statement stops the program. It can also return a number telling DOS (or some other program) whether it ran succesfully or not.
http://www.cs.colorado.ed...CSCI1200-96/transfer.html

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • TheBorg
  • Registratie: November 2002
  • Laatst online: 23-04 16:45

TheBorg

Resistance is futile.

Ik heb op bootdisk.com ff een disk gedownload van ME en bekeken hoe ze het daar hebben gefixed. :P

Verwijderd

Topicstarter
LOL TheBorg; gewoon door /L:%CDROM% te gebruiken kan ik dus in een batch file %CDROM% laten defenieren met de cdromdrive letter... hmmm lijkt easy maar niet geheel logisch...

maar ok, ik zou dus halt(1) voor C kunnen gebruiken... tnx...

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 23-04 16:45

TheBorg

Resistance is futile.

Ik vergis me. :o
CD-Rom is idd makkelijk, gewoon /L:driveletter. Niet dat je er iets aan hebt, want dat is dus al gebeurd...
De ramdrive, daar gebruiken ze rare truukjes voor en een .EXE om te kijken wat de drive is.

[ Voor 16% gewijzigd door TheBorg op 24-11-2004 21:41 ]


Verwijderd

Topicstarter
Ja al snap ik niet hoe de bootdisk aan %cdrom% komt maar dat zal wel aan mij liggen :P.

misschien dat je er een logische verklaring voor hebt?

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 23-04 16:45

TheBorg

Resistance is futile.

Die wordt volgensmij ook in het batch filetje gedefiniert waar ook de ramdrive letter uitgevogeld word. :)

Verwijderd

Ze setten eerst in autoexec
code:
1
2
set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C

oftewel lgldrv bevat 'nummer + letter alfabet' in aflopende volgorde.

Vervolgens roepen ze setramd aan met als param die lgldrv
code:
1
call setramd.bat %LglDrv%

Als eerste roepen ze daar de findramd aan:
code:
1
a:\findramd

welke de RAMDRIVE opzoekt, en de driveletter retourneert als een nummer
code:
1
2
sweeps all possible drive letters to find ramdrive
returns i errorlevel for drive (C:=3)


Dan maken ze gebruik van een truukje waarvoor je het shift commando moet kennen:
code:
1
2
3
4
5
6
7
8
9
10
11
Changes the position of replaceable parameters in a batch file.

SHIFT [/n]

If Command Extensions are enabled the SHIFT command supports
the /n switch which tells the command to start shifting at the
nth argument, where n may be between zero and eight.  For example:

    SHIFT /2

would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected.[/quote]

Als je iets aanroept als volgt:
code:
1
commando A B C D

Dan geldt:
code:
1
2
3
%1 = A
%2 = B
enz

In de loop zetten ze de CD-rom, shiften vervolgens 2 keer (1 letter verder) en kijken dan of het nummer overeenkomt met het errorlevel.
code:
1
2
3
4
5
6
7
8
goto do_shift
:loop
if errorlevel %1 goto no_shift
:do_shift
set cdrom=%2
shift
shift
if not %1*==* goto loop


Op die manier komt de CD-rom altijd 1 hoger dan de ramdrive te zitten.

Stel nu dat jij een .exe hebt die als errorlevel de locatie van de CD-rom teruggeeft, dan kun je dit doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set LglDrv=26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C

<roep je .exe aan>

:loop
set cdrom=%2
if errorlevel %1 goto found
shift
shift
goto loop

:found
echo De CD-rom zit op schijfletter %2
echo De generaal is gaaf!

[ Voor 19% gewijzigd door Verwijderd op 25-11-2004 02:04 ]


Verwijderd

hmz, kan je niet beter iets in je batchfile doen als

code:
1
2
3
4
5
6
7
@echo off
rem reserveer environment ruimte voor env var cdrom
set cdrom=0
detectcdrom.exe
...
...
...


Dus eerste 'omgevings ruimte' reserveren en deze vervolgens vullen
in je 'cd rom detectie programma.
Is wat korter lijkt mij ....

Je kan namelijk in een executable gewoon environment var's zetten, mits deze in dezelfde omgeving (lees; command prompt) en de ruimte al aanwezig is.

[ Voor 46% gewijzigd door Verwijderd op 25-11-2004 01:36 ]


Verwijderd

Verwijderd schreef op donderdag 25 november 2004 @ 01:34:
hmz, kan je niet beter iets in je batchfile doen als

Dus eerste 'omgevings ruimte' reserveren en deze vervolgens vullen
in je 'cd rom detectie programma.
Is wat korter lijkt mij ....
Dat is waar, alleen is het vullen van zo'n variabele nogal een bitch in Turbo Pascal. Als TS dat toch wil, wat info:
De omgeving is een stuk gereserveerd geheugen binnen DOS waarin strings kunnen worden geschreven. De strings die in de omgeving staan opgeslagen, zijn ASCIIZ-strings, dus arrays van tekens afgesloten door een binaire 0 (in Pascal CHR(0)). Het Einde van de significante informatie in de omgeving wordt aangegeven door nog een binaire 0 na de binaire 0 die het einde van de laatste string in de omgeving aangeeft. Als de omgeving met een binaire 0 begint, staat er niets in.

De DOS-omgeving staat aan het begin van het codesegment van uw Pascal-programma, in een gebied van 256 bytes met de naam PSP (Program Segment Prefix). Bij offset $2C in de PSP staat een segmentadres van 2 bytes voor het segment van de eerste byte van de DOS-omgeving. (De offset van de eerste byte van de omgeving is altijd 0). Om de omgeving te vinden hoeven we dus maar te schrijven:
code:
1
OmgSegment := MEMW[CSEG : $2C];

Hierin is OmgSegment een integer.
bron: Programmeren in Borland Pascal, Jeff Duntemann, ISBN 90 395 0038 X
Je kunt ook op zoek gaan naar de SetEnv functie:
For assigning a value to (a parent process's) environment value
you have to access and manipulate the Program Segment Prefix and
Memory Control Blocks. This is a rather complicated undertaking. A
source code with an accompanying article by Trudy Neuhaus can be
found in PC Magazine Volume 11 Number 1 pages 425-427.
The budding TP programmers should note that the elementary trick
of Exec (GetEnv('comspec'), '/c set key=whatever') will achieve only
a transient result for the duration of the exec shell. When you exit
the shell after this endeavor, the environment will be as it was.
Here is about the why. When the above command is executed, MsDos
makes a copy of the environment, and uses the copy. When the above
shelling terminates, the copy of the environment is deleted, and the
original is restored. Hence the above trick cannot be used to change
the parent environment.
If you don't want to try to go through this rather complicated
task yourself, the routines
"SETENV Set a parent environment variable (variable=value)"
"SETENVSH Set an environment variable for the duration of shelling"
can be found in my TP TPU collection garbo.uwasa.fi:/pc/ts/
tspa33*.zip (* = 40,50,55,60,70). No source code is included, nor
available, though.
One further detail. Users sometimes ask how one can change the
prompt or the path from within a Turbo Pascal program. This is in no
way different from changing the value of any other environment
variable. Both PATH and PROMPT are environment variables that can be
set with the MsDos SET command in the fashion described in the
above. This is not changed in any way by the fact that you can apply
PROMPT and PATH also in an alternative format not requiring the SET
command.
De site genoemd in dit stukje tekst, staan ze alleen jammer genoeg niet meer op.

Korter zal het iig niet zijn, denk ik.

[ Voor 50% gewijzigd door Verwijderd op 25-11-2004 09:17 ]


Verwijderd

Is het gelukt?
Pagina: 1