[VB.NET] Command line arguments

Pagina: 1
Acties:
  • 1.028 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • hp197
  • Registratie: Juni 2006
  • Laatst online: 04-06 21:56
Hey hey alle :)

Ik heb een vraag, en zoals de naam al doet vermoeden....
Heeft die te maken met command line opties, en nee. Het is niet hoe ik ze op moet vragen :P

Het programma:
Ik ben een command line programmatje aan het maken (genaamd XMove) om alle bestanden in map xyz die matchen aan een patern (bijv: *.log) te verplaatsen naar map zxy. Trick hierbij is, dat als het bestand al bestaat in map zxy dat hij het te verplaatsen bestand eigenhandig gaat hernoemen naar iets anders.

Op dit moment zijn dit mijn command line opties:
XMove.exe [SOURCE DIR] [PATERN] [DEST DIR]

Het probleem:
Ik split de command line opties op een spatie, maar soms zit er in het pad ook een spatie... hier split hij dan verkeerd op. Ten tweede moet je paden met een spatie dubbel quoten, maar dit vind VB niet zo leuk waardoor ik die weer moet strippen.

Mijn vraag:
Is er een makkelijke manier (d.m.v. bijv. een cmd line parser), die alles netjes afhandeld?
Of mag ik 200 regels code aan command line parser gaan tikken om uiteindelijk 20 regels uit te kunnen voeren?

Mvg
HP197

Acties:
  • 0 Henk 'm!

Anoniem: 50683

Hier al eens gekeken:klik ?

Acties:
  • 0 Henk 'm!

  • hp197
  • Registratie: Juni 2006
  • Laatst online: 04-06 21:56
Jep.....

Wat ik dan krijg is hoe je ze op moet vragen...
Wat ze ook bijna allemaal doen is op spatie splitten...
Of ze pakken geen dubbele quotes als input / ze parsen die verkeerd.

Maar dat is juist wat fout gaat bij mij ;)

[ Voor 21% gewijzigd door hp197 op 01-11-2007 10:44 ]


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 03-06 15:40
Als je bij visual basic spaties in je path hebt moet je in je vbprogramma

Visual Basic:
1
chr(34)  & string & chr(34)

string is hierbij de inputvariable (bijvoorbeeld [PATTERN])


chr(34) is " (dubbele aanhalingstekens) dit zorgt ervoor dat je string voor paths goed gebruikt wordt :)

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • hp197
  • Registratie: Juni 2006
  • Laatst online: 04-06 21:56
Jep, weet ik....

Probeer nu is dit: test.exe "c:\test\"

omat er een \ als laatste teken in zit, ziet hij dat als escape voor de dubbele quote :s

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

VB gebruikt helemaal geen slashes om tekens te escapen? Want anders zou je \t een tab veroorzaken. Volgens mij haal je nu een beetje c# en VB door elkaar
Visual Basic:
1
dim a as string = " ""hello"" world";

geeft als result: "hello" world, twee quotes ( ' heet een apostrof!) een enkele quote. Dit werkt zo als sinds ik met VB 3.0 (zal ergens in 1993/1994 geweest zijn) aan de gang ging.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Anoniem: 127222

Ik denk dat ik je probleem wel begrijp, alleen ik heb hem niet. Misschien doe ik het anders.
Wat jij bedoeld is dat als je een argument op de commandline meegeeft met een spatie erin, dat er kwootjes omheen moeten. Vervolgens als je dit loswrikt in VB.Net negeert ie de kwootjes en splitst ie alles alsnog waar een spatie staat.

Mijn testcode is als volgt:
Visual Basic:
1
2
3
4
5
6
7
8
9
Module Module1
  Public Sub main(ByVal sArgs() As String)
    Dim I As Integer
    For I = 0 To UBound(sArgs)
      Console.WriteLine(sArgs(I))
    Next

  End Sub
End Module


Als ik nu argumenten mee geef met een spatie erin en omringt door kwootjes, worden ze gewoon als 1 argument aangegeven.
Probeer deze manier eens, werkt perfecet bij mij.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
hp197 schreef op donderdag 01 november 2007 @ 12:10:
Jep, weet ik....

Probeer nu is dit: test.exe "c:\test\"

omat er een \ als laatste teken in zit, ziet hij dat als escape voor de dubbele quote :s
Dan doe je test.exe "c:\test\\" gewoon \ escapen

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
rwb schreef op donderdag 01 november 2007 @ 16:57:
[...]

Dan doe je test.exe "c:\test\\" gewoon \ escapen
Zoals gezegd; VB(.Net) escaped quotes met een quote. Ook moeilijk doen met een Chr(34) is daarom onzin en het maakt je code er niet leesbaarder op. De makkelijkste manier is dan ook de manier van c00.

[ Voor 26% gewijzigd door RobIII op 01-11-2007 18:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

Dat klopt niet helemaal.
Als je geen quotes gebruikt bij de aanroep van je argumenten, telt een \ als een gewone backslash.
Gebruik je echter quotes rond je argumenten, dan telt een \ ook als backslash, tenzij de backslash net voor de sluitende quote staat ...

Zo werkt het in 2.0 applicaties met VB.NET 2005 gemaakt.

Wat de topicstarter wil zal waarschijnlijk wel Environment.GetCommandLineArgs() zijn.

Een testset:
test = test.exe

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
C:\>test c:\van *.txt c:\naar
argument 0 = test
argument 1 = c:\van
argument 2 = *.txt
argument 3 = c:\naar

C:\>test c:\van\ *.txt c:\naar\
argument 0 = test
argument 1 = c:\van\
argument 2 = *.txt
argument 3 = c:\naar\

C:\>test "c:\van" *.txt "c:\naar"
argument 0 = test
argument 1 = c:\van
argument 2 = *.txt
argument 3 = c:\naar

C:\>test "c:\van deze map" *.txt "c:\naar deze map"
argument 0 = test
argument 1 = c:\van deze map
argument 2 = *.txt
argument 3 = c:\naar deze map

C:\>test "c:\van\" *.txt "c:\naar\"
argument 0 = test
argument 1 = c:\van" *.txt c:\naar"


Alles werkt, behalve de laatste, waar een \ gebruikt wordt net voor de afsluitende quote

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
era.zer schreef op zaterdag 03 november 2007 @ 23:15:
Alles werkt, behalve de laatste, waar een \ gebruikt wordt net voor de afsluitende quote
Dat heeft niks te maken met het escapen in VB.Net maar met het escapen van quotes in de commandline (in principe escape je de commandline quotes dus). ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

Wie verkeerd escapete weet ik niet, maar ik dacht al windows, maar waarom gebeurt er geen escape als de backslash ergens anders staat dan voor de afsluitende quote?

bv.:
"c:\van" zou dan toch c:van moeten opleveren als resultaat ? aangezien de v ge-escapet wordt.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

\v is geen geldige escape sequence, dus dat blijft \v. \\ en \" zijn echter wel escape sequences voor resp. \ en "

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 03-06 15:40
RobIII schreef op donderdag 01 november 2007 @ 18:53:
[...]

Zoals gezegd; VB(.Net) escaped quotes met een quote. Ook moeilijk doen met een Chr(34) is daarom onzin en het maakt je code er niet leesbaarder op. De makkelijkste manier is dan ook de manier van c00.
Spijt me zeer maar iig in VB6 werkte het met chr wel en met dubbele quotes niet. (iig voor een ICFTP control, maar de zelfde syntax zal wel gebruikt worden lijkt me)

Anyway als "C:\test\" niet werkt, welke input ontvangt je programma dan? "C:\test"? dat lijkt me makkelijk op te lossen door achter elke string "\" te plakken.

string test1 = test1 & "\"

[ Voor 11% gewijzigd door roy-t op 04-11-2007 18:12 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
therat10430 schreef op zondag 04 november 2007 @ 18:11:
Spijt me zeer maar iig in VB6 werkte het met chr wel en met dubbele quotes niet. (iig voor een ICFTP control, maar de zelfde syntax zal wel gebruikt worden lijkt me)
Spijt mij ook zeer, maar ik heb jaren in VB6 geprogrammeerd en ik weet 100% zeker dat een dubbele quote werkt.
Visual Basic 6:
1
MsgBox "Hello ""world"""

Als het niet gewerkt zou hebben met ICFTP dan gebeuren er of ranzige dingen in die control, of zat de fout ergens anders (misschien in het verzenden/ontvangen ofzo). Hoe dan ook maakt de compiler/interpreter van een dubbele quote gewoon een enkele die in een string staat; de software 'weet' er niet eens iets van; dan is het namelijk al gecompiled/interpret.
Daar heb je sinds .Net een mooiere syntax voor:

Visual Basic .NET:
1
test1 &= "\"

;)

[ Voor 21% gewijzigd door RobIII op 04-11-2007 19:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1