Call con parametro

mercoledì 20 febbraio 2008 - 16.56

almax Profilo | Junior Member

Ciao

mi serviva sapere come faccio a gestire un marametro lanciato dariga di comando cioè:

chiamo il mio exe da riga di comando call/file.exe , se aggiungo un parametro da riga di comando cioè
call/file.exe %20
come faccio a gestirlo e quindi compiere l'operazione chiamata dal parametro?

Grazie ..

aiedail92 Profilo | Expert

Ciao

devi impostare la sub (o void) main del progetto per accettare come parametro un array di string. Quando il programma viene lanciato come dici te ogni argomento è dato da una stringa nell'array:

C#

//Generalmente nel file Program.cs static void Main(string[] args) { //args contiene tutti gli argomenti passati all'avvio //... //avvii l'applicazione vera e propria }

Per il VB invece devi aggiungere un nuovo modulo e una Sub Main, dalla quale richiami poi l'applicazione vera e propria; nella scheda applicazione delle proprietà del progetto devi impostare l'oggetto di avvio sul modulo che hai aggiunto:

Public Module MainModule Public Sub Main(ByVal args() As String) 'args contiene tutti gli argomenti passati all'avvio '... 'poi chiami l'applicazione vera e propria End Sub End Module

Luca

almax Profilo | Junior Member

non ho capito benissimo .. ti faccio un esempio

la mia applicazione legge in una directory i file e li cicla tutti ... tramite un bat chiamo l'apllicazione con un parametro(nome file)

quindi sarebbe così call/applicazione.exe %1234

ecco io vorrei ricevere quel parametro ... come faccio ? considera che la chiamata è come se fosse da cmd ...

Grazie

aiedail92 Profilo | Expert

Scusa, forse sono io che non ho capito benissimo

L'applicazione che chiami dal .bat è l'applicazione che stai sviluppando? Quindi se è così significa che vuoi richiamare l'applicazione da se stessa (mediante il .bat) passandole dei parametri, che vuoi ricevere nella tua applicazione quando la chiami dal .bat, giusto?

Se non è così prova a spiegarti meglio, magari aggiungi qualche frammento del codice...

Luca

almax Profilo | Junior Member

si esatto è così .... Una procedura chiama prima un'applicativo, alla fine il mio e passa un parametro .. vorrei leggere quel partametro per poter velocizzare la procedura .... come se usassi da cmd netstat -a vorrei capire come poter leggere quel parametro -a, quindi poi poter gestire il tutto con degli if etc etc .. Scusa per eventuali errori ma ho cambiato tastiera devo abituarmi ...

Grazie

aiedail92 Profilo | Expert

Ok

Quindi quando viene avviata la tua applicazione viene chiamata la static void Main, (sub Main se usi VB)

Per far sì che vengano ricevuti gli argomenti la void Main accetta come parametro un array di string, come nel codice che ti ho scritto sopra. Quindi per verificare tutti i parametri non devi far altro che eseguire un blocco if (o switch) controllando i valori del parametro args:

static void Main(string[] args) { foreach(string arg in args) { switch(arg) { case "-a": //fai qualcosa break; case "-o"; //fai qualcos'altro break; //ecc... } } }

Public Module MainModule Public Sub Main(ByVal args() As String) For Each arg As String In args Select Case arg Case "-a" 'fai qualcosa Case "-o" 'fai qualcos'altro 'ecc... End Select Next End Sub End Module

Luca

almax Profilo | Junior Member

Non riesco a leggere il parametro..
provo a postare un po' di codice ....

Module Avvio
Dim a As Integer
Dim args() As String

Friend WithEvents nfiIcona As NotifyIcon
Public Sub Init()

nfiIcona = New NotifyIcon()
nfiIcona.Icon = New Icon((Path.GetDirectoryName(Application.ExecutablePath) + "\Word.ico"))
End Sub
Public Sub Main(ByVal args() As String)

Dim a As Integer
For Each arg As String In args
a = arg(0).ToString
Next
Init()
nfiIcona.Visible = True
MsgBox(a)
Application.Run()
End Sub



Private Sub crea()
If My.Computer.FileSystem.FileExists(Path.GetDirectoryName(Application.ExecutablePath) + "\setting.txt") Then
'lettura settaggi
Dim sr As New IO.StreamReader(Path.GetDirectoryName(Application.ExecutablePath) + "\setting.txt")
'qui leggo tutte le righe e le inserisco in un array
Dim dirs As New ArrayList
Do While sr.Peek() >= 0
dirs.Add(sr.ReadLine)
Loop
sr.Close()

'preparo word per creare il file
Dim oWord As Word.Application
Dim oDoc As Word.Document
Dim oPara1 As Word.Paragraph
Dim infarma As String
Dim pdfjob As New PDFCreator.clsPDFCreator
Dim print

If dirs(4).ToString = "" Then
MsgBox("Selezionare una stampante ", MsgBoxStyle.Exclamation, "Stampante Mancante")
Exit Sub
End If




'leggo la directori e i file txt

Dim str, files() As String
Dim di As New IO.DirectoryInfo(dirs(1).ToString)
Dim aryFi As IO.FileInfo() = di.GetFiles("*.txt")
files = Directory.GetFiles("i" & a & ".txt") \\\\\ QUI DOVREI LEGGERE IL PARAMETRO PASSATO DAL FILE.BAT

Ti spiego questo è un modulo che unisce piu' file txt,word, in un unico word e poi genera un pdf ; fin qui tutto ok ...
questa procedura sottoforma di applicativo che visualizza solo un'icona nella taskbar viene richiamata da un file .bat con un parametro che il file che io devo andare a prendere

se io scrivo creaword.exe -000001 non si avvia nulla anzi mi dà errore applicazione
se io scrivo creaword.exe tutta va ..

Come faccio a fare in modo che dal file bat possa passare il parametro e leggerlo dalla mia procedurina?

Grazie mille

aiedail92 Profilo | Expert

Ciao

Credo che l'errore sia qui:

> Public Sub Main(ByVal args() As String)
>
> Dim a As Integer
> For Each arg As String In args
> a = arg(0).ToString
> Next
> Init()
> nfiIcona.Visible = True
> MsgBox(a)
> Application.Run()
> End Sub

Infatti nel ciclo For Each assegni ad a (che è di tipo Integer) il primo carattere del parametro che passi all'applicazione quando l'avvii.
Quindi, poichè questo primo carattere è un trattino (se passi -000001) viene generata un'InvalidCastException.

Può risultarti utile eseguire il debug passando dei parametri all'applicazione; per falo apri le proprietà del progetto e nella scheda Debug inserisci, sotto opzioni di avvio, il valore dell'argomento della riga di comando. Così riesci step by step a trovare gli errori nell'applicazione

Luca

almax Profilo | Junior Member

Grande ...
Grazie moltissimo ....
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5