Avatar billede sandrasmurf Nybegynder
12. januar 2012 - 17:51 Der er 8 kommentarer og
1 løsning

Eksekverer Kommando i Prompt

Hej Eksperter

Cs2cs er et koordinat transformations command line tool. Læs koordinater fra 1 fil, transformer og skriv resultat til 1 anden fil.

Mit spørgsmål handler om hvordan jeg kan kalde dette command line tool fra C#.

Jeg forsøger at fyre følgende linie af i en kommando prompt:
cs2cs +proj=latlong +datum=WGS84 +to +proj=utm +zone=32 +ellps=intl +units=m +no_defs +towgs84=-87,-96,-120 SomePath\input.txt > SomePath\out.txt

(SomePath = Fuldstændig sti til en mappe)

Når jeg kører kommandoen manuelt i en prompt virker det uden problemer. cs2cs.exe er tilføjet til min PATH variabel og der genereres en out.txt baseret på input.txt.

Når jeg forsøger at gentage success'en inde fra C#, så er resultatet blot en tom out.txt.

-----------
Kode:
-----------
string args = "cs2cs +proj=latlong +datum=WGS84 +to +proj=utm +zone=32 +ellps=intl +units=m +no_defs +towgs84=-87,-96,-120 " + Path.Combine(tempDir, tempFileName) + " > " + Path.Combine(tempDir, "out.txt");

Process.Start("cmd.exe", args);
-----------

Spørgsmålet er naturligvis, hvad jeg gør galt.

Der bliver genereret en out.txt, så det må betyde, at cs2cs har været kørt. Men da filen er tom, og jeg ikke får nogen info om evt. fejl beskeder, så er jeg kørt en smule fast.

Kan nogen skubbe mig i den rigtige retning?
Avatar billede Slettet bruger
12. januar 2012 - 18:54 #1
Hvis den giver en fejl, kan du måske hvilken fejl du får ved at skifte > ud med 2>
Avatar billede bvli Praktikant
12. januar 2012 - 20:33 #2
Det er din redirect ikke virker i process.Start(..) Du kan sætte processen op før du starter den og redirecte output til en stream du kan læse fra.
Avatar billede sandrasmurf Nybegynder
13. januar 2012 - 11:16 #3
Jeg har tidligere leget med at redirecte output fra processen, men mener ikke, at det gav bonus.

Nu prøvede jeg igen, og har nu efter trial and error opdaget, at hvis jeg starter cs2cs i stedet for cmd.exe, så bliver cs2cs resultatet skrevet til redirected output stream. Step 2 er så at jeg selv generere output filen.

Process process = new Process();
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.FileName = "cs2cs";
            process.StartInfo.Arguments = " +proj=latlong +datum=WGS84 +to +proj=utm +zone=32 +ellps=intl +units=m +no_defs +towgs84=-87,-96,-120 " + Path.Combine(tempDir, tempFileName) + " > " + Path.Combine(tempDir, "out.txt");
            process.Start();
            string s = process.StandardOutput.ReadToEnd();
            process.WaitForExit();

            StreamWriter outWriter = new StreamWriter(Path.Combine(tempDir, "out.txt"));
            outWriter.Write(s);
            outWriter.Flush();
            outWriter.Close();

Jeg får desværre 2 fejl skrevet ud i konsollen fra cs2cs. En fejl 2 og en fejl 22. Jeg kan ikke umiddelbart finde fejlkode beskrivelser for cs2cs, og da koordinaterne ser fornuftige ud, så regner jeg ikke med at grave dybere.

Jeg synes stadig det er magisk/mystisk, at cs2cs ikke laver out.txt, men i stedet smider output til redirected output stream.

bvli, smid et svar. Du hjalp mig på rette vej.
Avatar billede bvli Praktikant
13. januar 2012 - 16:39 #4
Svar..

Fejl 2 plejer i øvrigt at være "File not found". cs2cs skriver jo bare til stdout (som f.eks. Console.WriteLine()) det er normal opførsel fra et kommandolinieprogram, så man kan pipes og redirects. Det er din shell (cmd.exe) som skal håndtere redirects ikke cs2cs.

Men fint du fik det til at virke! Husk at dispose din Process.
Avatar billede arne_v Ekspert
14. januar 2012 - 21:55 #5
Der blev faktisk brugt cmd i den oprindelige kode, saa > til en fil burde virke.
Avatar billede sandrasmurf Nybegynder
16. januar 2012 - 12:38 #6
Arne: Min oprindelige plan med at starte cmd.exe og køre cs2cs besværgelsen, medførte netop, at der blev oprettet en out.txt. Så via cmd virker < logikken. Output filen var dog tom og jeg fik ingen fejlbeskeder.

bvli:
Er det nødvendigt at kalde Dispose - det skal man da aldrig i managed kode?

Jeg kan se, at der findes en Close metode på en Process - den er nok fornuftig at indsætte.

p.Close();
p.Dispose();
Avatar billede arne_v Ekspert
16. januar 2012 - 20:10 #7
Et Process objekt holder ref til en unmanaged resource, saa Dispose giver god mening.
Avatar billede arne_v Ekspert
16. januar 2012 - 20:12 #8
Det lyder lidt som om det program er lidt sensitiv - og en fejl kunne nemt resultere i en tom output fil.
Avatar billede Slettet bruger
16. januar 2012 - 20:34 #9
Det kunne være interessant at vide om den skrev noget ud på stderr med 2>
Måske bliver miljøvariablerne ikke overført?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester