12 berichten aan het bekijken - 1 tot 12 (van in totaal 12)
  • Q:
    Geblokkeerd
    Anoniem

    Applescript traag

    Hallo!
    Ik ben een script aan het schrijven dat een code controlleert op de juiste tekens.
    Ik heb dit

    <br />
    set pw to "a1!!11aa!!1a!"<br />
    repeat<br />
    	if character 1 of pw contains some item of "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" then<br />
    		if character 2 of pw contains some item of "1234567890" then<br />
    			if character 3 of pw contains some item of "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    				if character 4 of pw contains some item of "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    					if character 5 of pw contains some item of "1234567890" then<br />
    						if character 6 of pw contains some item of "1234567890" then<br />
    							if character 7 of pw contains some item of "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" then<br />
    								if character 8 of pw contains some item of "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" then<br />
    									if character 9 of pw contains some item of "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    										if character 10 of pw contains some item of "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    											if character 11 of pw contains some item of "1234567890" then<br />
    												if character 12 of pw contains some item of "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    													if character 13 of pw contains some item of "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" then<br />
    														if character 14 of pw contains some item of "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    															display dialog "Gelukt"</p>
    <p>														else<br />
    															set status to false<br />
    														end if</p>
    <p>													else<br />
    														set status to false<br />
    													end if</p>
    <p>												else<br />
    													set status to false<br />
    												end if</p>
    <p>											else<br />
    												set status to false<br />
    											end if</p>
    <p>										else<br />
    											set status to false<br />
    										end if</p>
    <p>									else<br />
    										set status to false<br />
    									end if</p>
    <p>								else<br />
    									set status to false<br />
    								end if</p>
    <p>							else<br />
    								set status to false<br />
    							end if</p>
    <p>						else<br />
    							set status to false<br />
    						end if</p>
    <p>					else<br />
    						set status to false<br />
    					end if</p>
    <p>				else<br />
    					set status to false<br />
    				end if</p>
    <p>			else<br />
    				set status to false<br />
    			end if</p>
    <p>		else<br />
    			set status to false<br />
    		end if</p>
    <p>	else<br />
    		set status to false<br />
    	end if<br />
    	if status is true then<br />
    		exit repeat<br />
    	end if<br />
    end repeat<br />
     

    Hij is nu al een heletijd bezig en ik heb nog geen resultaat.
    Zit er een fout in de code die ik over het hoofd heb gezien? Of weet iemand hoe ik dit kan versnellen?

    Alvast bedankt

    Bijdrager
    Jakko Westerbeke

    Een deel van het probleem is denk ik dat je heel veel geneste ifs gebruikt, dat zou de boel best wel eens sterk kunnen vertragen ten opzichte van een repeat-lus met maar één if erin.

    Is er een specifieke reden waarom karakter 1 een letter moet zijn, karakter 2 een cijfer en karakters 3 en 4 een leesteken, enz.? Ja, omdat je dit als wachtwoordcontrole wilt gebruiken en je een wachtwoord op die manier opgebouwd wil zien — dat snap ik nog. Maar waarom laat je niet elk teken toe op elke positie? Dan hoef je alleen maar iets te doen als:

    set toegestaan to "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890`[email protected]#$%^&*()_+-=[]>?;:'"<br />
    set pw to "watjemaarwilt"<br />
    repeat with karakter in pw<br />
    	if karakter is some item of toegestaan<br />
    		set status to true<br />
    	else<br />
    		set status to false<br />
    		exit repeat<br />
    	end if<br />
    end repeat<br />
    if status is false then display dialog "Mislukt"

    (Bovenstaande is niet getest, het kan zijn dat ik me vergist heb ik hoe repeat-lussen ook alweer precies werken in AppleScript :))

    Bijdrager
    Mausy
    Jakko op 16 september 2011

    (Bovenstaande is niet getest, het kan zijn dat ik me vergist heb ik hoe repeat-lussen ook alweer precies werken in AppleScript :))

    Er zit inderdaad een foutje in het is:

    <br />
    repeat with i from 1 to number of items in pw<br />
    set karakter to item i of pw<br />
     

    Daarnaast is het handiger om in het begin status=true te maken en in de loop op false te zetten als de vergelijking faalt, om valse positieven te voorkomen.

    Bijdrager
    Verwijder

    Het script is niet traag, het hangt in een oneindige loop. Als een van de tests faalt wordt display dialog niet bereikt, status wordt zowiezo nooit true, het blijft herhalen.

    if character 2 of pw contains some item of "1234567890" then

    dit gaat niet werken, het test of een karakter een random karakter van een string bevat. De ene keer test het script b.v. of het te testen karakter “3” bevat, een andere keer “5”.
    Een betere test is:

    if "1234567890" contains character 2 of pw then

    of omgekeerd:

    if character 2 of pw is in "1234567890" then

    Er zijn nog een paar probleempjes maar daar kom je vanzelf achter.

    Geblokkeerd
    Anoniem

    Bedankt Willemien, Het is gelukt. Maar wat ik nu wil is dat er eerst gecontroleerd word of de variabele een bepaald aantal tekens heeft. Want als ik nu een teken in de var weglaat krijg ik de error dat hij het laatste teken niet kan controleren. Ik dacht eerst aan if pw > 13 maar dan controleert hij of het getal boven de 13 is. Maar ik wil dat hij het aantal tekens toelaat. Hoe doe ik dit?

    Geblokkeerd
    Anoniem

    Laatmaar. Ik moet leren eerst te googelen voordat ik iets vraag,
    ik heb het zo gedaan:

    <br />
    set mycount to count pw</p>
    <p>if mycount = 13 then<br />
    	display dialog "Goed aantal"<br />
    else<br />
    	display dialog "Verkeerd aantal"<br />
    end if</p>
    <p>
    Bijdrager
    Jakko Westerbeke
    Mausy op 16 september 2011

    Er zit inderdaad een foutje in het is:

    </p>
    <p>repeat with i from 1 to number of items in pw</p>
    <p>set karakter to item i of pw</p>
    <p>

    Nee, je kunt met repeat wel degelijk een string doorlopen op de manier die ik gebruikte. Waar m’n script de fout ingaat is het controleren of karakter wel voorkomt in toegestaan, kom ik achter nu ik het ook echt probeer — waarschijnlijk omdat ik die controle rechtstreeks overgenomen had van Daan:) Wat gesleutel levert dit op, dat wel werkt:

    set toegestaan to "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890`[email protected]#$%^&*()_+-=[]>?;:'"<br />
    set pw to "watjemaarwilt"<br />
    set status to true<br />
    considering case<br />
    	repeat with karakter in pw<br />
    		if karakter is not in toegestaan then<br />
    			display dialog "Mislukt"<br />
    			set status to false<br />
    			exit repeat<br />
    		end if<br />
    	end repeat<br />
    end considering

    (De considering case is nodig voor het geval je ook op het juiste gebruik van hoofd- en kleine letters wilt controleren, anders laat je dit weg zodat AppleScript die als gelijk beschouwt.)

    Mausy op 16 september 2011

    Daarnaast is het handiger om in het begin status=true te maken en in de loop op false te zetten als de vergelijking faalt, om valse positieven te voorkomen.

    Daar heb je gelijk in, ja.

    daankorssen op 17 september 2011

    ik heb het zo gedaan:

    Dat script doet heel wat anders dan je eerste. Het eerste is een poging te controleren of bepaalde tekens op bepaalde posities staan in de string pw, terwijl het tweede alleen maar kijkt of pw wel een bepaalde lengte heeft.

    Geblokkeerd
    Anoniem

    Dat script doet heel wat anders dan je eerste. Het eerste is een poging te controleren of bepaalde tekens op bepaalde posities staan in de string pw, terwijl het tweede alleen maar kijkt of pw wel een bepaalde lengte heeft.

    De post erboven even lezen:wink:

    Bedankt Willemien, Het is gelukt. Maar wat ik nu wil is dat er eerst gecontroleerd word of de variabele een bepaald aantal tekens heeft. Want als ik nu een teken in de var weglaat krijg ik de error dat hij het laatste teken niet kan controleren. Ik dacht eerst aan if pw > 13 maar dan controleert hij of het getal boven de 13 is. Maar ik wil dat hij het aantal tekens toelaat. Hoe doe ik dit?

    Geblokkeerd
    Anoniem

    Maar toch bedankt voor je moeite!
    het volledige script is nu dit:

    <br />
    set theFile to (choose file with prompt "Select a valid key file to read:" of type {"DKkey"})<br />
    open for access theFile<br />
    set pw to (read theFile)<br />
    close access theFile</p>
    <p>set mycount to count pw</p>
    <p>if mycount = 13 then<br />
    	set status to true</p>
    <p>	if character 1 of pw is in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" then<br />
    		if character 2 of pw is in "1234567890" then<br />
    			if character 3 of pw is in "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    				if character 4 of pw is in "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    					if character 5 of pw is in "1234567890" then<br />
    						if character 6 of pw is in "1234567890" then<br />
    							if character 7 of pw is in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" then<br />
    								if character 8 of pw is in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" then<br />
    									if character 9 of pw is in "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    										if character 10 of pw is in "`[email protected]#$%^&*()_+-=[]>?;:'" then<br />
    											if character 11 of pw is in "1234567890" then<br />
    												if character 12 of pw is in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" then<br />
    													if character 13 of pw is in "`[email protected]#$%^&*()_+-=[]>?;:'" then</p>
    <p>													else<br />
    														set status to false<br />
    													end if<br />
    												else<br />
    													set status to false<br />
    												end if<br />
    											else<br />
    												set status to false<br />
    											end if<br />
    										else<br />
    											set status to false<br />
    										end if<br />
    									else<br />
    										set status to false<br />
    									end if<br />
    								else<br />
    									set status to false<br />
    								end if<br />
    							else<br />
    								set status to false<br />
    							end if<br />
    						else<br />
    							set status to false<br />
    						end if<br />
    					else<br />
    						set status to false<br />
    					end if<br />
    				else<br />
    					set status to false<br />
    				end if<br />
    			else<br />
    				set status to false<br />
    			end if<br />
    		else<br />
    			set status to false<br />
    		end if<br />
    	else<br />
    		set status to false<br />
    	end if</p>
    <p>	if status is true then<br />
    		display dialog "Valid key file"<br />
    	else<br />
    		display dialog "Invalid Key File"<br />
    	end if<br />
    else<br />
    	display dialog "Invalid Key File"<br />
    end if<br />
     
    Bijdrager
    Jakko Westerbeke

    Lees m’n opmerking over considering case even, anders ga je tot de ontdekking komen dat “abc123” gelijk is aan “ABC123”:)

    Bijdrager
    dj bazzie wazzie

    Om van die complexe if-statements af te komen kan je ook een regular expression gebruiken.

    zoets als dit werkt ook

    <br />
    KeyFileFormat("a1[!11AA!]13[") --result: false<br />
    KeyFileFormat("a1[!11AA!]1A[") --result: true<br />
    on KeyFileFormat(theString)<br />
    	if theString's length is not 13 then<br />
    		return false<br />
    	end if<br />
    	set symbols to "[`[email protected]#$%^&()_+\\-=[]>?;:']"<br />
    	set regex to "[[:alpha:]][[:digit:]][%][%][[:digit:]][[:digit:]][[:alpha:]][[:alpha:]][%][%][[:digit:]][[:alpha:]][%]"<br />
    	try<br />
    		do shell script "/bin/echo -n " & quoted form of theString & " | tr " & quoted form of symbols & " % | egrep " & quoted form of regex<br />
    		return true<br />
    	on error<br />
    		return false<br />
    	end try<br />
    end KeyFileFormat<br />
     
    Bijdrager
    Jakko Westerbeke

    Ergens vermoed ik dat dat nog wat te hoog gegrepen is;)

12 berichten aan het bekijken - 1 tot 12 (van in totaal 12)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.