Hallo

Welkom, Gast. Alsjeblieft inloggen of registreren.

Recent

220 gasten, 0 leden

Welkom, Gast. Alsjeblieft inloggen of registreren.

28 maart 2024, 21:10:14

Login met gebruikersnaam, wachtwoord en sessielengte

Nieuws

Welkom op het vernieuwde NL Computer Forum!

Auteur Topic: Win2000 opdrachtbestand  (gelezen 6466 keer)

0 leden en 1 gast bekijken dit topic.

Offline Stefan de Best
  • Wizop
  • *****
  • Berichten: 601
  • Geslacht: Man
    • Historisch-didactisch overzicht van 150 oude en minder bekende zwemslagen
Win2000 opdrachtbestand
« Gepost op: 8 november 2009, 22:44:28 »
Bericht 1 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:Hugo KornelisDatum:15-04-2004
 Aan:AllenMsgID:1449.1
 Onderwerp:Win2000 opdrachtbestandForum:ws-nlcomputer
L.S.,

Om mezelf het leven makkelijker te maken heb ik onder W2000 een paar opdrachtbestanden (.cmd) in elkaar gefrutseld zodat ik met slepen voor een serie bestanden ineens dezelfde opdracht kan uitvoeren.

Het volgende voorbeeld werkt perfect:

(ExecSQL.cmd)
@echo. >ExecSQL.out
for %%f in (%*) do osql -E -n < %%f >>ExecSQL.out
notepad ExecSQL.out

Als ik een serie SQL-bestanden selecteer en die op de snelkoppeling naar ExecSQL.cmd laat vallen, dan wordt elk van die bestanden n voor n aan osql.exe aangeboden, de output verzameld in ExecSQL.out en als alle bestanden verwerkt zijn verschijnt een kladblok-venster met de resultaten.

Vandaag heb ik er weer n gemaakt:

(Import.cmd)
@echo. >Import.out
for %%f in (%*) do Import1 %%f >>Import.out
notepad Import.out

Als ik hier een serie bestanden op laat vallen, dan worden ook nu n voor n de bestanden aangeboden aan Import1.cmd (een ander opdrachtenbestand, in dezelfde directory). Daarna houdt de verwerking echter op - kladblok wordt niet automatisch geopend. Ik kan wel zelf Import.out openen in kladblok en dan zie ik dat Import1.cmd wel is verwerkt voor elk van de bestanden. Alleen de opdrachten n de for worden kennelijk niet meer uitgevoerd.

Aangezien deze beide bestanden zo ongeveer een kopie van elkaar zijn, snap ik niet waarom de tweede niet helemaal wordt uitgevoerd. Wie kan me helpen?

Alvast bedankt!!

Groetjes, Hugo


Bericht 2 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:Michel Uphoff (Sysop)Datum:15-04-2004
 Aan:Hugo KornelisMsgID:1449.2
 Onderwerp:Win2000 opdrachtbestandForum:ws-nlcomputer
Dag Hugo,

Import1.cmd is een batchbestand (of meer fancy tegewoordig een NT opdrachtscript genaamd).
Zit daar soms een exit statement in? Zo ja, haal dat er uit, want anders wordt na verwerking door Import1.cmd de uitvoer niet teruggegeven aan Import.cmd.

Nu zitten er wat verschillen in de script syntax en de .bat syntax, dus als je er niet uitkomt, zou ik graag ook de inhoud van die Import1.cmd zien. Je krijgt geen foutmeldingen (of deze zijn door een eventueel cls in het script niet te lezen)?

Michel Uphoff
(Sysop)



Bericht 3 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:Hugo KornelisDatum:16-04-2004
 Aan:Michel Uphoff (Sysop)MsgID:1449.3
 Onderwerp:Win2000 opdrachtbestandForum:ws-nlcomputer
Hoi Michel,

Nee, geen exit statement. En ik zie ook geen foutmeldingen langskomen op het scherm, noch zie ik foutmeldingen in de geredirecte output (althans niet afkomstig van de batch verwerking - de utilities die in het script worden aangeroepen produceren wel berichten).

De tekst van import1.cmd:

@echo off
echo use PRF1test >hulp.sql
echo go >>hulp.sql
echo set nocount on >>hulp.sql
echo go >>hulp.sql
echo exec h_Import2ProcRegels '%~n1' >>hulp.sql
echo go >>hulp.sql
echo delete h_Import >>hulp.sql
echo go >>hulp.sql
bcp PRF1test..h_Import in %1 -T -f bcp.fmt >NUL
osql -E -n <hulp.sql

Vrij simpel, eigenlijk: met echo produceer ik een bestandje met SQL-opdrachten (waarbij in n van de regels het naam-deel wordt gebruikt van de bestandsnaam die door Import.cmd aan dit script is doorgegeven, daarom moet ik dit bestand bij elke aanroep opnieuw maken.) Vervolgens gebruik ik bcp (een utility die bij SQL Server hoort) om de inhoud van het bestand te kopiren in een tabel en tenslotte gebruik ik osql (ook een utility van SQL Server) om de SQL-opdrachten die ik zojuist in hulp.sql heb gezet te laten uitvoeren. De uitvoer van bcp kieper ik weg; de uitvoer van osql niet (dus die komt uiteindelijk door de redirect in Import.cmd in het uitvoerbestand Import.out te staan, en die ik liefst automatisch in Notepad op mijn scherm zou krijgen als de for-lus in Import.cmd is afgesloten).

Heb je hier iets aan?

Groetjes, Hugo


Bericht 4 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:Michel Uphoff (Sysop)Datum:16-04-2004
 Aan:Hugo KornelisMsgID:1449.4
 Onderwerp:Win2000 opdrachtbestandForum:ws-nlcomputer
Hoi Hugo,

>> osql -E -n <hulp.sql <<

Je bent lekker aan het ping-pongen met redirecting.

Zet onder aangehaalde regel eens echo import1 is gereed.

Verschijnt deze melding op het scherm?

Zo nee, dan vermoed ik dat osql iets uitvreet waardoor de batch niet afgemaakt wordt.
Zo ja, pas dan import.cmd eens aan als volgt:

for %%f in (%*) do Import1 %%f >>Import.out
echo import cmd tot notepad afgewerkt
notepad Import.out

Verschijnt deze melding niet, dan kan import1 de opdrachtverwerking niet terug geven aan import.cmd . Verschijnt hij echter wel, dan wordt het vreemd, want dan moet of notepad starten, of je moet een foutmelding krijgen (bestand niet gevonden oid).

Dat osql is toch niet iets 'dossigs' dat een eigen environment aanmaakt?

Michel Uphoff
(Sysop)



Bericht 5 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:Hugo KornelisDatum:20-04-2004
 Aan:Michel Uphoff (Sysop)MsgID:1449.5
 Onderwerp:Win2000 opdrachtbestandForum:ws-nlcomputer
Hoi Michel,

Bedankt voor het meedenken.

> Zet onder aangehaalde regel eens echo import1 is gereed.
>
> Verschijnt deze melding op het scherm?

Niet op het scherm (door de redirect), maar wel in Import.out.

> Zo nee, dan vermoed ik dat osql iets uitvreet waardoor de batch niet
> afgemaakt wordt.
> Zo ja, pas dan import.cmd eens aan als volgt:
>
> for %%f in (%*) do Import1 %%f >>Import.out
> echo import cmd tot notepad afgewerkt
> notepad Import.out
>
> Verschijnt deze melding niet, dan kan import1 de opdrachtverwerking niet
> terug geven aan import.cmd . Verschijnt hij echter wel, dan wordt het
> vreemd, want dan moet of notepad starten, of je moet een foutmelding
> krijgen (bestand niet gevonden oid).

Hij verschijnt niet, dus kennelijk komt inderdaad de besturing niet terug. Wat me zo verbaast is dat wel de for-lus helemaal wordt afgewerkt. Als ik bijvoorbeeld vier bestanden naar het ikoon van import1.cmd toesleep, dan krijg ik dus de volgende uitvoer in Imoprt.out:

import1 is gereed
import1 is gereed
import1 is gereed
import1 is gereed

> Dat osql is toch niet iets 'dossigs' dat een eigen environment aanmaakt?

Geen idee. Het is een programma dat wordt bijgeleverd met SQL Server. De utility leest tekst van stdin, geeft dat door aan de SQL Server service en schrijft het resultaat naar stdout. Je kunt met de parameter -i filename aangeven dat de commando's in dat bestand staan; in dat geval wordt dus niet meer van stdin gelezen. Uiteraard heb ik al geprobeerd of dat helpt - niet dus.

Maar als het inderdaad aan osql ligt, hoe komt het dan dat mijn script ExecSQL.cmd (zie eerste post in deze thread) wl de resultaten in notepad toont nadat alle bestanden verwerkt zijn?

Groetjes, Hugo

Historisch-didactisch overzicht van 150 oude en minder bekende zwemslagen
     http://www.zwemslagen.nl