[Powershell V1] operatoren zitten met dwars?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • its_Muppet
  • Registratie: Juli 2003
  • Laatst online: 07-09 13:06
Ik ben een beetje aan het spelen met Powershell en ik zit nu met een probleem waar ik niet uitkom. Ik ben nu ruim een uur aan het k#tten.

Onderstaande code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$snelheid = Read-Host "Goedendag, wat was uw snelheid?"

If ($snelheid -gt 50 -and $snelheid -lt 76) {
    (Write-Host "Dat kost u €100!")
    }
ElseIf
    ($snelheid -gt 75) {
    (Write-Host "Dat kost u €200,-!")
    }
ElseIf
    ($Snelheid -gt 99) {
    (Write-Host "Dat kost u uw rijbewijs!")
    }
Elseif
    ($snelheid -le 50) {
    (Write-Host "U mag doorrijden, fijne dag verder!")
    }



Loopt goed, behalve als de userinput 100 of meer is. Dan krijg ik de melding U mag doorrijden, fijne dag verder!

Wat doe ik fout?

"Assumption is the mother of all f#ckups" Travis Dane (Under Siege 2: Dark Territory)


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 17-09 12:55

MAX3400

XBL: OctagonQontrol

Je bakent af tot 99 km/h als bovengrens. Lijkt me dat er nog een elseif moet komen met -gt 100 "Wegpiraat"?

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je scrhijf op regel 11 snelheid opeens met een hoofdletter waar je dat elders niet doet :?
MAX3400 schreef op zondag 22 november 2009 @ 17:27:
Je bakent af tot 99 km/h als bovengrens. Lijkt me dat er nog een elseif moet komen met -gt 100 "Wegpiraat"?
Ik ben niet (zo) bekend met powershell, maar -gt lijkt me "Greater than" (en gte dus greater and/or equal vermoed ik) dus -gt 99 lijkt me alles boven 99...?

Maar dan zou 'ie de tweede case in duiken (100 is namelijk ook meer dan 75) en dan snap ik dus even niet waaom 'ie bij de laatste case zou uitkomen? [edit] Wat HuHu dus zegt hieronder...

Dus op regel 7 zou nog een -and lt 100 moeten komen.

[ Voor 87% gewijzigd door RobIII op 22-11-2009 17:31 ]

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!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Als de snelheid hoger is dan 100, dan zou ik met deze code de uitvoer "Dat kost u €200,-!" verwachten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$snelheid = 100

If ($snelheid -gt 50 -and $snelheid -lt 76) {  // False, dus ga verder
    (Write-Host "Dat kost u €100!")
    }
ElseIf
    ($snelheid -gt 75) { // True, dus klaar
    (Write-Host "Dat kost u €200,-!")
    }
ElseIf
    ($Snelheid -gt 99) { // Wordt overgeslagen
    (Write-Host "Dat kost u uw rijbewijs!")
    }
Elseif
    ($snelheid -le 50) { // Wordt overgeslagen
    (Write-Host "U mag doorrijden, fijne dag verder!")
    }

Acties:
  • 0 Henk 'm!

  • its_Muppet
  • Registratie: Juli 2003
  • Laatst online: 07-09 13:06
HuHu schreef op zondag 22 november 2009 @ 17:29:
Als de snelheid hoger is dan 100, dan zou ik met deze code de uitvoer "Dat kost u €200,-!" verwachten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$snelheid = 100

If ($snelheid -gt 50 -and $snelheid -lt 76) {  // False, dus ga verder
    (Write-Host "Dat kost u €100!")
    }
ElseIf
    ($snelheid -gt 75) { // True, dus klaar
    (Write-Host "Dat kost u €200,-!")
    }
ElseIf
    ($Snelheid -gt 99) { // Wordt overgeslagen
    (Write-Host "Dat kost u uw rijbewijs!")
    }
Elseif
    ($snelheid -le 50) { // Wordt overgeslagen
    (Write-Host "U mag doorrijden, fijne dag verder!")
    }
Kan ik inkomen, maar als ik dan een extra afbakening op regel 7 zet, gelijk aan regel 3, doet hij het nog niet.

"Assumption is the mother of all f#ckups" Travis Dane (Under Siege 2: Dark Territory)


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Oké... deze shit is echt heel vaag :D. De volgende code:

code:
1
2
3
4
5
$snelheid = Read-Host "Goedendag, wat was uw snelheid?"

If ($snelheid -gt 50 -and $snelheid -lt 76) { (Write-Host "Dat kost u €100!") }
ElseIf ($snelheid -gt 75) { (Write-Host "Dat kost u €200,-!") }
Else { (Write-Host "Homo") }


De resultaten:

code:
1
2
3
4
       $snelheid <  50 = Homo
 50 <= $snelheid <  75 = Dat kost u €100!
 75 <= $snelheid < 100 = Dat kost u €200!
100 <= $snelheid       = Homo


Het lijkt er op dat het niet goed om kan gaan met getallen groter of gelijk aan 100.

Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 22:45
Lijkt me een gevalletje strings als getallen interpreteren. Heeft Powershell niet een parseInt-iets?

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ik denk dat ik het begrijp. De cmdlet Read-Host geeft zijn invoer terug als een string, als tekst dus. De operatoren -gt en -lt gebruiken dan de lexicografische sortering voor het vergelijken van beide waarden.

Lexicografisch gezien is 100 kleiner dan 20. Net als dat "aap" kleiner is dan "banaan". De "a" komt eerder dan de "b" en de 1 komt eerder dan de 2.

Het omdraaien van je vergelijkingen zal het oplossen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$snelheid = Read-Host "Goedendag, wat was uw snelheid?"

If (50 -lt $snelheid -and 76 -gt $snelheid) {
    (Write-Host "Dat kost u €100!")
    }
ElseIf
    (75 -lt $snelheid) {
    (Write-Host "Dat kost u €200,-!")
    }
ElseIf
    (99 -lt $snelheid) {
    (Write-Host "Dat kost u uw rijbewijs!")
    }
Elseif
    (50 -ge $snelheid) {
    (Write-Host "U mag doorrijden, fijne dag verder!")
    }


Let ook op het feit dat de -lt en -gt omgewisseld zijn en dat de volgorde voor de 75/99 controle nu wel juist is.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Wat gebeurt er als je:

code:
1
[int]$snelheid = Read-Host "..."
doet?

Ook bouw je normaal van groot naar klein, dwz:
code:
1
2
3
4
5
6
7
8
9
10
11
12
if( ... > 100)
{
}
else if( ... > 76)
{
}
else if(... > 50)
{
}
else
{
}

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • DR
  • Registratie: December 2000
  • Niet online

DR

Werkt
code:
1
[int] $var = read-host '...'


al niet?

[edit]
Scherm open laten en dan reply tikken is dus weer te traag :P

[ Voor 35% gewijzigd door DR op 22-11-2009 18:07 ]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[int]$snelheid = Read-Host "Goedendag, wat was uw snelheid?";

If($Snelheid -gt 99)
{
    Write-Host "Dat kost u uw rijbewijs!"
}
ElseIf($snelheid -gt 75) 
{
    Write-Host "Dat kost u €200,-!"
}
ElseIf ($snelheid -gt 50)
{
    Write-Host "Dat kost u €100!"
}
Else
{
    Write-Host "U mag doorrijden, fijne dag verder!"
}


Dit werkt perfect :P Good luck.

Misschien eens gaan inlezen op variable typen. Blijkbaar converteert PS niet implliciet.

Sowieso vind ik het altijd beter om niet te switchten tussen variable types (I like strongly typed!)

Specifieer dus altijd het type (geeft het minste problemen, zeker bij grotere scripts).

Om te converteren van string naar int doe je gewoon:
code:
1
2
[string]$var1 = "5";
[int]$var2 = [int]$var1;


Als laatste: je kan altijd dit doen om iets te controlleren:

code:
1
2
3
4
5
6
7
8
9
PS C:\Users\Snake> $myUntypedVar = "5";
PS C:\Users\Snake> $myUntypedVar.getType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:\Users\Snake>
om het type te checken ;)

[ Voor 21% gewijzigd door Snake op 22-11-2009 18:27 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • its_Muppet
  • Registratie: Juli 2003
  • Laatst online: 07-09 13:06
Thanx Snake!

Alhoewel ik niet helemaal duidelijk heb waarom het op mijn manier niet goed gaat.
Daarnaast snap ik niet helemaal wat je bedoelt met
Misschien eens gaan inlezen op variable typen. Blijkbaar converteert PS niet implliciet.
Sowieso vind ik het altijd beter om niet te switchten tussen variable types (I like strongly typed!)
Is mijn enige fout dan geweest de volgorde van de nummers?

"Assumption is the mother of all f#ckups" Travis Dane (Under Siege 2: Dark Territory)


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

its_Muppet schreef op zondag 22 november 2009 @ 19:42:
Thanx Snake!

Alhoewel ik niet helemaal duidelijk heb waarom het op mijn manier niet goed gaat.
Daarnaast snap ik niet helemaal wat je bedoelt met
[...]

Is mijn enige fout dan geweest de volgorde van de nummers?
Je fout is dat je het behavior niet kent van PS (ik ook niet trouwens).

Maar als ik het zo bekijk: als je een string met een int vergelijkt, dan behandeld hij de string als een string en converteert hij de string niet impliciet naar een int.

Waarom dat het niet jouw manier gaat: je vergelijkt een string met een int. Dat geeft andere resultaten als een int met een int :)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Oh, BTW, Waar hoort mijn topic?
SEA >> PRG

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