Fichier batch

Fichier batch - Shell/Batch - Programmation

Marsh Posté le 13-12-2015 à 20:43:29    

Bonsoir à tous
 
Je me permet de venir ici vous demander de l'aide car je n'y connais absolument rien en programmation.
J'ai cherché pas mal de chose sur le net, mais je ne comprends rien.
 
Je vous explique : J'ai un PC à la maison qui fait office de "serveur" de stockage.
Je possède à côté deux autres PC
 
J'aimerais trouver un fichier.bat qui me permettrais de mettre en veille prolongée ou hibernation  le serveur si aucuns des deux autres PC n'est allumé, ou si tel ou tel programme n'est pas lancé sur le serveur.
 
J'ai ma petite idée, mais je ne sais pas comme m'y prendre.
 
Je pense qu'il faudrait que le serveur ping les 2 PC toutes les 10 minutes. Si aucuns paquets n'est transmis avec succès, alors le PC serveur peut se mettre en veille prolongée. Dans le cas contraire, il retente dans 10 minutes.
J'aimerais également, qu'il regarde si tel ou tel programme n'est pas lancé. J'aimerais aussi qu'il vérifie ça toutes les 10 minutes  
 
J'espère que j'ai assez bien expliqué ma demande.
 
Merci d'avance pour votre aide


Message édité par Dream0386 le 19-12-2015 à 19:44:20
Reply

Marsh Posté le 13-12-2015 à 20:43:29   

Reply

Marsh Posté le 13-12-2015 à 21:13:40    

Déjà la question standard: Tu es obligé de faire ça en batch? C'est l'horreur ce truc, autant utiliser un language correct genre C ou un language script genre Perl.

 

Tes ordis ils tournent sous quel(s) OS?

 

Pour voir à travers le réseau si un autre PC est allumé le ping c'est bien et facile à faire: Sur le serveur suffit de lancer la commande ping et au niveau des deux PC il n'y a rien à faire, ils répondent au ping par défaut. Par contre pour voir si tel ou tel programme est lancé c'est plus dur, à mon avis c'est la le point difficile, car je ne pense pas qu'il existe une commande toute faite pour ça (à travers le réseau bien entendu). Il faudrait (à mon avis) faire tourner un programme/script dédié sur chaqu'un des deux PC qui (le programme) devra écouter sur le réseau si on s'adresse à lui et répondre le cas échéant Ca m'a l'air bien compliqué, mais une petite recherche rapide retourne deux codes Perl très courts qui m'ont l'air très prometteurs. Reste la question si le Perl peut être utilisé et le(s) OS des machines.

 

edit: Corrige le titre de ton message, ta question n'a rien à voir avec Flash/ActionScript...


Message édité par rat de combat le 13-12-2015 à 21:15:49
Reply

Marsh Posté le 19-12-2015 à 10:35:19    

Bonjour
 
Désolé de na pas avoir répondu plus tôt, j'étais en déplacement. je suis rentré hier soir.
 
Les deux PC et le serveur sont sous Windows 10 Pro
Il existe peut être un langage plus simple, je sais pas je n'y connais rien.
 
Sur le fait de voir si tel ou tel programme est lancé, en fait le PC qui ferait office de serveur me sert aussi à regarder des films sur la TV.
Simplement, j'aimerais que si VLC ou autres programmes est lancé sur le serveur, il ne s’éteigne pas .
 
Dans le titre du message, je mets quoi alors?
 

Reply

Marsh Posté le 19-12-2015 à 17:29:56    

Ok, je ne connais pas W10 mais je suppose que Perl tourne aussi là-dessus. Perl c'est bien, c'est libre et donc gratuit par contre c'est pas tout petit au niveau espace disque dur / nombre de fichiers. Sur un PC moderne ça ne devrait pas poser problème je pense. Personnellement j'utilise la distribution Strawberry Perl.
 
Je veux bien essayer de bricoler quelque chose à base des scripts dont je parlais, par contre je ne suis pas du tout un pro et je n'ai pas W10 pour tester ce qui ne facilite pas les choses (non, mon PC est trop ancien pour utiliser une VM)...
 
Pour le titre du message tu peux mettre [Shell/Batch] ou [Perl] si tu veux utiliser ça. Par contre tout ça pour quelqu'un qui n'y connait "absolument rien en programmation" le chemin peut-être long...

Reply

Marsh Posté le 19-12-2015 à 19:48:12    

Merci a toi pour tes réponses.
 
Quand tu dis "c'est pas tout petit niveau espace disque dur" tu veux dire qu'il y'a une grosse installation à faire avant?
 
je voulais partir avec un fichier bath parce que ça ne prends pas bcp de place, pas d'installation à faire etc.
 
Sur le net j'avais trouvé en fouillant un bout de programme en batch, mais comme je n'y connais rien, j'ai pas pu l'adapter à mes besoins

Reply

Marsh Posté le 19-12-2015 à 20:05:30    

L'installation n'est pas complexe mais effectivement il y a beaucoup de fichiers, mon dossier "strawberry" (avec quelque modules rajoutés plus tard) fait 376MB avec >14.000 fichiers... Effectivement le batch c'est beaucoup plus économe mais bien plus chiant à faire fonctionner. Pour le ping ça peut encore passer mais pour ton histoire de vérifier si tel ou tel programme tourne aucune chance. Après on peut certainement faire un truc bien petit (un seul petit exécutable) avec du C par exemple mais le C c'est beaucoup plus disons "basique" que le Perl, il faudrait certainement faire beaucoup plus de code (complexe) pour y arriver (moi je ne saurais pas faire).

Reply

Marsh Posté le 19-12-2015 à 20:16:16    

ok pour la place. 376 MB ce n'est rien.
 
pour le fait de vérifier un programme tourne, on est bien d'accord, je veux simplement vérifier si par exemple vlc n'est pas lancé sur le serveur lui même, pas sur une autre machine. Tu penses que ça pourrait être plus simple du coup? lol

Reply

Marsh Posté le 19-12-2015 à 23:04:33    

Attends, tu dis que tu veux vérifier par un programme sur le serveur que tel ou tel programme ne tourne pas sur le serveur aussi? C'est quoi alors cette histoire de réseau, j'ai mal compris? :o  
 
Si c'est ok pour utiliser du Perl ça me paraît tout à fait faisable, surtout sans cette histoire de réseau.

Reply

Marsh Posté le 20-12-2015 à 11:03:28    

Bonjour. je récapitule lol
 
je voudrait simplment que le serveur ping les deux autres PC afin de voir si ils sont allumés ou éteins. Si ils sont éteints, alors le serveur peux lui se mettre en veille prolongée. Si il y en a un des deux allumé alors, il reste allumé, et recommencera le ping 15 minutes après.
 
Enfin, le serveur me sert aussi à regarder des films en bluray sur ma TV.
J'aimerais simplement qu'il ne se coupe pas si je suis en train de regarder des films avec, et cela, même si les deux autres PC sont éteins.  

Reply

Marsh Posté le 20-12-2015 à 13:02:08    

il y a aucun, mais alors aucun intérêt à utiliser perl pour ce genre de besoin surtout sur un environnement windows...
 
un script PowerShell que tu mets en tache planifiée suffit largement.

Reply

Marsh Posté le 20-12-2015 à 13:02:08   

Reply

Marsh Posté le 20-12-2015 à 13:28:18    

Bonjour Je@nb
 
tu saurais me faire ce script ou pas?
Bien évidemment, j'aimerais aussi avoir des explications sur ce que veux dire chaque ligne

Reply

Marsh Posté le 20-12-2015 à 13:40:51    

Je@nb a écrit :

il y a aucun, mais alors aucun intérêt à utiliser perl pour ce genre de besoin surtout sur un environnement windows..


 
Si: C'est un language avec lequel je peux me débrouiller. Après si tu connais le PowerShell effectivement ca doit être mieux car plus léger...

Reply

Marsh Posté le 20-12-2015 à 15:59:09    

j'ai trouvé ça sur le net .
 
Vous en pensez quoi? moi je ne comprends rien
#!/bin/sh
 
echo 'Debut du programme'
 
Domaine='172.128.1.'
Eteindre_PC=true
 
#lancer la commande pour vérifier si VLC est lance
ps -e | grep vlc | grep -v grep
#Récuperer le resultat
if [ ! $? -eq 0 ]
then
 
 #lancer la commande pour vérifier si totem est lance
 ps -e | grep totem | grep -v grep
 #Récuperer le resultat
 if [ ! $? -eq 0 ]
        then
 
  #Parcourir une plage d'adresse IP
  for Valeur_ip in `seq 2 20`;
  do
   #Ping une adresse IP
   ping -q -c5 $Domaine$Valeur_ip > /dev/null
   #Récuperer le resultat
   if [ $? -eq 0 ]
   then
    #Ne pas eteindre
    Eteindre_PC=false
   fi
 
  done
        else
                Eteindre_PC=false
 fi
else
Eteindre_PC=false
fi
 
#Eteindre le serveur si aucun PC sur le réseau
if [ $Eteindre_PC == true ]
then
 
 shutdown -h now
fi
 
echo 'Fin du programme'

Reply

Marsh Posté le 20-12-2015 à 17:30:22    

Ca c'est un truc pour je ne sais quelle console Linux, ça ne marchera pas sous Windows.

Reply

Marsh Posté le 20-12-2015 à 19:23:56    

En perl, un truc dans ce gout la devrait faire l'affaire:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use Net::Ping;
  6. use Win32::API;
  7. use Win32::Process::Info;
  8. use Win32::ShutDown;
  9.  
  10. # mettre ici les deux adresse IP de ses PC
  11. my $adresse1 = "192.168.1.1";
  12. my $adresse2 = "192.168.1.2";
  13. # et ici les noms des programmes
  14. my $program1 = "perl.exe";
  15. my $program2 = "python.exe";
  16.  
  17. my $pinger = Net::Ping->new("icmp" );
  18. my $pinformer = Win32::Process::Info->new();
  19. while (1) {
  20.  my @info = $pinformer->GetProcInfo();
  21.  # on filtre pour éliminer tout ce qui n'est pas associé à un des programmes à surveiller
  22.  @info = grep { defined $_->{Name} and $_->{Name} =~ m/^($program1|$program2)$/ } @info;
  23.  if ((@info > 0)                        # programme actif sur le serveur?
  24.      or ($pinger->ping($adresse1))      # client1 up?
  25.      or ($pinger->ping($adresse2))) {   # client2 up?
  26.    # une des conditions est réalisée. On attend 10 mn et on retente.
  27.    sleep(60*10);
  28.    next;
  29.  } else {
  30.    # pas de programme actif ni de pc distant, on arrête tout
  31.    $pinger->close();
  32.    Win32::ShutDown::ForceShutDown();
  33.    # ou bien pour un hibernate
  34.    # my $api = Win32::API->new('Powrprof', 'SetSuspendState', 'NNN', 'N') || die "Can't load API : $!\n";
  35.    # $api->Call(1,0,0);
  36.  }
  37. }


 
A+,


Message édité par gilou le 21-12-2015 à 15:47:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-12-2015 à 19:28:13    

typo, ligne 14 c'est certainement $program2

Message cité 1 fois
Message édité par rat de combat le 20-12-2015 à 19:28:27
Reply

Marsh Posté le 20-12-2015 à 19:34:17    

En powershell détaillé:
 

Code :
  1. [string[]] $computers = @("192.168.200.15","192.168.200.31" ) #List of computers to check
  2. $pingResults = Test-Connection -ComputerName $computers -Quiet #Ping all computers in the list, return an array of booleans
  3. $atLeastOneComputerUp = $false
  4. $pingResults |% { $atLeastOneComputerUp = $atLeastOneComputerUp -or $_ } #Check to see if at least computer replied so its value is True and the variable will be true
  5. if (-not $atLeastOneComputerUp) { #All computers off, we go to hibernate
  6.     Add-Type -AssemblyName System.Windows.Forms #Load a .net dll with code needed to go to hibernate
  7.     [System.Windows.Forms.Application]::SetSuspendState([System.Windows.Forms.PowerState]::Hibernate, $false, $false) #call function to hibernate
  8. }

Reply

Marsh Posté le 20-12-2015 à 19:36:41    

Pour le programme pas lancé j'ai pas fait mais c'est easy aussi.
C'est quoi la condition : si aucun pc répond et si cette liste de programme n'est pas lancé alors on hiberne ?

Reply

Marsh Posté le 20-12-2015 à 19:54:27    

merci à tous de vous pencher sur le problème
 
Je@nb oui on hiberne si les deux PC ne répondent pas au ping, et si VLC n'est pas lancé.
 
J'aimerais aussi qu'on m'explique comment faire si je veux rajouter un programme dans la condition

Reply

Marsh Posté le 20-12-2015 à 19:56:24    

rat de combat a écrit :

typo, ligne 14 c'est certainement $program2

:jap:  
Corrigé et mis un code alternatif pour un hibernate plutot que shutdown
 
A+,


Message édité par gilou le 20-12-2015 à 20:12:12

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-12-2015 à 20:00:53    

Code :
  1. [string[]] $computers = @("192.168.200.15","192.168.200.31" ) #List of computers to check
  2. [string[]] $programs = @("vlc" )
  3. #Check other Computers
  4. $pingResults = Test-Connection -ComputerName $computers -Quiet #Ping all computers in the list, return an array of booleans
  5. $atLeastOneComputerUp = $false
  6. $pingResults |% { $atLeastOneComputerUp = $atLeastOneComputerUp -or $_ } #Check to see if at least computer replied so its value is True and the variable will be true
  7. #Check programs
  8. $atLeastOneProgramRunning = $false
  9. foreach ($program in $programs) {
  10.     if (Get-Process -Name $program -ErrorAction SilentlyContinue) { #The program is running
  11.         $atLeastOneProgramRunning = $true
  12.         return
  13.     }
  14. }
  15. if (-not ($atLeastOneComputerUp -or $atLeastOneProgramRunning)) { #All computers off and no programs are running, we go to hibernate
  16.     Add-Type -AssemblyName System.Windows.Forms #Load a .net dll with code needed to go to hibernate
  17.     [System.Windows.Forms.Application]::SetSuspendState([System.Windows.Forms.PowerState]::Hibernate, $false, $false) #call function to hibernate
  18. }


 
Tu changes les IP ou tu en rajoutes, séparé par des virgules
Pour les programmes, pareil, tu met "program1","program2","program3"...) séparé par des virgules

Reply

Marsh Posté le 21-12-2015 à 14:19:45    

Merci Je@nb.
 
Par contre comment lui il reconnais le programme? il faut pas que je mette vlc.exe ou si je veux rajouter une application, je ne doit pas mettre le vrai nom exact du .exe?
 
Pour mettre en place tout ça, il faut simplement que je colle ça dans un fichier bloc note et que j'enregistre ça en .bat?

Reply

Marsh Posté le 21-12-2015 à 14:21:44    

Ensuite j'aimerais répéter ce code toutes les 15 minutes. je peux faire ça comment? on peux le mettre directement dans le code?

Reply

Marsh Posté le 21-12-2015 à 16:04:54    

Il faut mettre le nom de l'exe sans .exe :D.
Genre winword pour word, excel pour Excel etc.
 
Oui copie colle ça (sans les numéro de lignes, faut double cliquer sur le code pour les faire disparaitre) et enregistre en .ps1
 
Pour le répéter toutes les 15 minutes, lance le depuis le planificateur de taches

Reply

Marsh Posté le 21-12-2015 à 18:47:51    

Merci Je@nb
 
J'ai mis tout ça en place le script à l'air de fonctionner SAUF :  
 
Les deux PC étaient allumés, vlc n'était pas en marche. J'ai exécuté le script avec power shell, et le PC s'est quand mis en hibernation
 
Normalement il aurait du rester allumé, vu que les deux autres le sont.
 
Comment je peux modifier ça?
 
En fait il faut que le PC ping les deux. Si un des deux ou les deux répondent, alors, il reste allumé.
Si aucuns des deux PC ne répond, alors il regarde si aucun programmes dans la liste n'est lancé.
Si un programme dans la liste est lancé, alors il recommence depuis les début du script (ping des deux PC)
Si aucuns des programmes de la liste n'est lancé, alors il peut se mettre en hibernation.
 
Tu vois ce que je veux dire Je@nb
 
En tout cas je tiens d'abord à te remercier pour ce premier script


Message édité par Dream0386 le 21-12-2015 à 18:48:05
Reply

Marsh Posté le 21-12-2015 à 19:20:58    

Autant pour moi
 
Le script fonctionne parfaitement, c'est moi qui ai fait une erreur.
 
Par contre j'ai un autre problème
 
Ler script fonctionne uniquement lorsqu'il est ouvert dans la console powershell.
 
Mais en tant que tache planifiée, ça ne marche pas.
Lorsque je fais clic droit sur le script, puis executer avec powershell, la console s'ouvre, mais rien ne se passe. L'écran de la console reste bleu.
 
Tu aurais une solution?

Reply

Marsh Posté le 21-12-2015 à 21:29:21    

Bizarre.
Le script attends qq secondes que le ping passe ou pas. (j'ai pas en tête mais c'est plusieurs essai de ping)
 
Sinon j'ai mis return au lieu de break, ça améliore les perfs mais bon c'est pas important et on voit pas la fin
 
tu peux réessayer ?
 

Code :
  1. [string[]] $computers = @("192.168.200.10","192.168.200.31" ) #List of computers to check
  2. [string[]] $programs = @("vlc" )
  3. #Check other Computers
  4. Write-Host "Ping computers ..."
  5. $pingResults = Test-Connection -ComputerName $computers -Quiet #Ping all computers in the list, return an array of booleans
  6. $atLeastOneComputerUp = $false
  7. $pingResults |% { $atLeastOneComputerUp = $atLeastOneComputerUp -or $_ } #Check to see if at least computer replied so its value is True and the variable will be true
  8. if ($atLeastOneComputerUp) { Write-Host "At least one computer is up !" } else { Write-Host "None computers up !" }
  9. #Check programs
  10. $atLeastOneProgramRunning = $false
  11. foreach ($program in $programs) {
  12.     if (Get-Process -Name $program -ErrorAction SilentlyContinue) { #The program is running
  13.         $atLeastOneProgramRunning = $true
  14.         break
  15.     }
  16. }
  17. if ($atLeastOneProgramRunning) { Write-Host "At least one programs run !" } else { Write-Host "None programs running" }
  18. if (-not ($atLeastOneComputerUp -or $atLeastOneProgramRunning)) { #All computers off and no programs are running, we go to hibernate
  19.     Add-Type -AssemblyName System.Windows.Forms #Load a .net dll with code needed to go to hibernate
  20.     [System.Windows.Forms.Application]::SetSuspendState([System.Windows.Forms.PowerState]::Hibernate, $false, $false) #call function to hibernate
  21. }

Reply

Marsh Posté le 21-12-2015 à 21:57:14    

Le script est plus rapide oui.
 
Il fonctionne très bien encore merci.
Mais j'ai l'impression que la tâche planifiée ne fonctionne pas.
 
En effet, comme je fait démarrer/executer et que je colle C:\extinction.ps1, ça m'ouvre le script sous le bloc note au lieu de l'éxécuter.
 
?

Reply

Marsh Posté le 21-12-2015 à 22:05:24    

lance plutôt powershell.exe -ExecutionPolicy Bypass -File c:\extinction.ps1

Reply

Marsh Posté le 21-12-2015 à 22:09:49    

alors  
lorsque je lance la taches planifiée avec ça rien ne se passe
 
Par contre lorsque je lance via démarrer executer, j'ai bien la console qui se lance avec le script

Reply

Marsh Posté le 21-12-2015 à 22:24:26    

fait voir ta tache planifiée

Reply

Marsh Posté le 22-12-2015 à 11:03:34    

Salut Je@nb
 
C'est bon, j'ai réussi à mettre la tâche planifiée correctement.
Tout fonctionne parfaitement.
 
Tu es un génie!!!
 
Je te remercie grandement pour ce script

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed