correction : je te déconseille de les masquer, il est préférable de les désactiver.
cmdow est un programme externe tu peux le lancer en Powershell ou batch ou autre.
Discussion :
correction : je te déconseille de les masquer, il est préférable de les désactiver.
cmdow est un programme externe tu peux le lancer en Powershell ou batch ou autre.
Bonjour Eric
Depuis que j'ai modifier le timing à 30 secondes, c'est mieux pas aussi fiable que lorsque j'avais le code ci-dessous...
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
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
28
29
30
31
32
33
34
35
36
37
38
39
40 Private Sub ValeurCarte_LostFocus() 'Déclaration des variables Dim winShell As New ShellWindows Dim IE As InternetExplorer Const stURL As String = "https://ecritf.paytec.ch/" Dim IEDoc As HTMLDocument Dim InputGoogleZoneTexte As HTMLInputElement For Each IE In winShell If IE.LocationURL = stURL Then Exit For Next IE If Not IE Is Nothing Then 'Affichage de la fenêtre IE IE.Visible = True 'On pointe le membre Document Set IEDoc = IE.Document 'On pointe notre Zone de texte Set InputGoogleZoneTexte = IEDoc.all("amount") 'On définit le texte que l'on souhaite placer à l'intérieur InputGoogleZoneTexte.Value = Me.[Valeur Carte] 'On pointe notre bouton Set InputGoogleBouton = IEDoc.all("pay") 'On simule un clic InputGoogleBouton.Click End If 'On libère les variables Set IE = Nothing Set IEDoc = Nothing End Sub
Est-il possible de modifier quelques lignes dans le code actuel pour avoir la même gestion... le problème vient je pense de IE, car le temps d'ouverture , le temps que les champs dans IE soit affiché, le temps que le client rentre son code sur le terminal, bref je pense que le problème vient de là alors qu'avec l'ancien code, je n'avais pas de soucis mais c'était en direct depuis access
MErci
Je voit, le code transmit vérifie et utilise un IE déjà ouvert.
Que ce passe t'il avec ton "ancien code" si il n'y à pas de IE ouvert ? Il semblerai qu'il ne passe rien ou que ça plante.
Oui je dois d'abord ouvrir ie pour que ça fonctionne... Mais ensuite ça marche très bien.
Voici une adaptation plus fidèle de ton code d'origine.
Je te laisse modifier les timers qui sont fonction de ta latence (poste, RAM, débit ...)
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 $dossier = "C:\MonDossierASurveiller" function Ie_Pay([string] $valeur) { $url = "https://ecritf.paytec.ch/" $ie = $null # Récupère les instances de Internet Explorer $ies = (New-Object -ComObject Shell.Application).Windows() | Where-Object{$_.Name -eq "Internet Explorer"} # Si il n'en existe aucune if ($ies -eq $null) { # On la crée $ie = New-Object -COMObject InternetExplorer.Application } else { # Récupère l'instance ayant la bonne url $ie = $ies | Where-Object{$_.LocationURL -eq $url} | Select-Object -First 1 # Si aucune instance n'a la bonne url if ($ie -eq $null) { # On prend la première instance $ie = $ies | Select-Object -First 1 } } # On rend visible $ie.visible = $true # On vérifie si on n'est pas sur la bonne url if ($ie.LocationURL -ne $url) { # Alors on y va $ie.Navigate($url) While ($ie.Busy) { Start-Sleep -Milliseconds 100 } Start-Sleep -Milliseconds 1000 } # Défini la valeur $ie.Document.getElementById("amount").value = $valeur Start-Sleep -Milliseconds 1000 # Clique sur le bouton $ie.Document.getElementById("pay").Click() Start-Sleep -Milliseconds 1000 } Write-Host "$((Get-Date).ToString()) : Surveillance du dossier $dossier" while($true) { foreach($file in Get-ChildItem -Path ($dossier + "\*.pay")) { Write-Host "`n`n$((Get-Date).ToString()) : Fichier trouvé $($file.Name)" $valeur = $file.BaseName -replace "\.", "," Write-Host "$((Get-Date).ToString()) : Valeur $valeur" [double]$result = 0 if([double]::TryParse($valeur, [ref] $result)) { Write-Host "$((Get-Date).ToString()) : Valeur valide" try { Write-Host "$((Get-Date).ToString()) : Traitement dans IE" Ie_Pay -valeur $valeur Write-Host "$((Get-Date).ToString()) : Suppression du fichier" Remove-Item -Path $file.FullName -Force Write-Host "$((Get-Date).ToString()) : Terminée" } catch { Write-Host "$((Get-Date).ToString()) : Une erreur s'est produite !" -ForegroundColor Red } } else { Write-Host "$((Get-Date).ToString()) : Valeur non valide !" -ForegroundColor Red } } Start-Sleep -Seconds 1 } exit
Je ne vois pas comment tu peux afficher un message à la tentative de fermeture d'un script batch. Je reste donc sur la désactivation de la fenêtre.
Voici comment tu peut faire.
Tu place l'utilitaire cmdow.exe à coté de ton fichier script (dans le même dossier)
En batch
Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 title TEST "%~dp0cmdow.exe" @ /dis /ren "Verrouiller : TEST" pause
En Powershell
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 & ".\cmdow.exe" '@', '/dis', '/ren', '"Verrouiller : TEST"' pause
Pour plus d'informations sur les possibilités de cmdow tu peux consulter la page d'aide : https://ritchielawrence.github.io/cmdow/#usage
Beaucoup de choses à tester, c'est trop sympa ! Un rapide premier test, montre que c'est intéressant....
Si je veux être sur que ma page internet est bien complètement chargée avant d'envoyer le montant, je dois modifier le deuxième start sleep du code ? Car si il y a des lenteurs internet, j'aimerais assurer que la page soit entièrement charger car autrement je risque une erreur car le code ne trouvera pas "amount"
Merci
Avec le deuxième, ça à l'air de jouer...
Afin de simplifier pour mes utilisateurs, je pense crée un exe qui lance le powershell, le batch ainsi que la fenetre IE. LE matin ou après un redémarrage, ils n'auront qu'un programme à lancer, et ce programme va juste lancer les 3 autres...
Ou alors si il y a un bug, que se programme tue les 3 programmes et les relance.
Faut-il faire ça en batch, powershell autres ?
Merci
Ah mais en plus c'est pour des utilisateurs. ahah
Ben comme tu préfère un batch suffira pour le lancement.
Tu peux ajouter ceci après chaque action
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 While ($ie.Busy) { Start-Sleep -Milliseconds 100 }
Le dernier bout de code attend que la page soit chargée et ensuite attend encore 100 milliseconds ?
Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 While ($ie.Busy) { Start-Sleep -Milliseconds 100 }
Plus j'avance et plus je remarque que je suis nul...
J'ai commencé le batche qui va lancer le powershell, ie et l'autre batch ü
start tiroir_caisse.bat ... youpie ça marche... mais ça ne marche pas pour powershell, j'ai l'impression que pour powershell, il faut une commande executer plutôt. Et pour ie non plus car ça m'ouvre une fenêtre dos !!!
Apparemment, ça marche avec ce code:
Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 PowerShell -NoProfile -ExecutionPolicy Bypass -File "".....\Tiroir_caisse\paytech.ps1"" -Verb RunAs start ouvrir_caisse_bat
Et ça marche pour fermer les programmes avec ce code
Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part taskkill /f /im cmd.exe
Mais les 2 ensembles, ça ne marche pas...
Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 taskkill /f /im cmd.exe PowerShell -NoProfile -ExecutionPolicy Bypass -File "".....\Tiroir_caisse\paytech.ps1"" -Verb RunAs start ouvrir_caisse_bat
Que dois-je modifier ?
Oups .. bien entendu si je tue tout les cas.exe, je tue aussi l'actuel donc la commande n'ira pas plus loin.... Est-il possible de tuer tout les cas.exe sauf l'actuel ? Ou alors est-il possible de nommer les CMd.exe à tuer ? Merci
Je crois avoir trouvé la solution... je vais tester ces prochains jours !
Oui tu peux spécifier le nom de la fenetre
En imaginant que tu veux tuer ta fenêtre cmd.exe qui a pour titre tata (titre définit avec la commande title)
Code batch : Sélectionner tout - Visualiser dans une fenêtre à part taskkill /f /im "cmd.exe" /fi "WINDOWTITLE eq tata"
C'est quasi parfait ! Je dois juste encore peaufiner les réglages des tempos
Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 # On vérifie si on n'est pas sur la bonne url if ($ie.LocationURL -ne $url) { # Alors on y va $ie.Navigate($url) While ($ie.Busy) { Start-Sleep -Milliseconds 100 } Start-Sleep -Milliseconds 2000 } # Défini la valeur $ie.Document.getElementById("amount").value = $valeur Start-Sleep -Milliseconds 2000 # Clique sur le bouton $ie.Document.getElementById("pay").Click() Start-Sleep -Milliseconds 100
Pourquoi après le "on y va " il y a 2 start sleep ? Il faut que je comprenne bien le fonctionnement si je veux les régler au mieux...
Merci
Tant que IE est occupé on fait une petite pause.
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 While ($ie.Busy) { Start-Sleep -Milliseconds 100 }
En théorie cette pause devrait suffire, mais des fois la pages n'est pas totalement chargé et IE n'est plus occupé, d’où la seconde pause.
Partager