Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1025 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Fichier batch

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fichier batch

n°2271494
Dream0386
Posté le 13-12-2015 à 20:43:29  profilanswer
 

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
mood
Publicité
Posté le 13-12-2015 à 20:43:29  profilanswer
 

n°2271496
rat de com​bat
attention rongeur méchant!
Posté le 13-12-2015 à 21:13:40  profilanswer
 

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
n°2271958
Dream0386
Posté le 19-12-2015 à 10:35:19  profilanswer
 

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?
 

n°2271967
rat de com​bat
attention rongeur méchant!
Posté le 19-12-2015 à 17:29:56  profilanswer
 

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...

n°2271975
Dream0386
Posté le 19-12-2015 à 19:48:12  profilanswer
 

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

n°2271976
rat de com​bat
attention rongeur méchant!
Posté le 19-12-2015 à 20:05:30  profilanswer
 

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).

n°2271978
Dream0386
Posté le 19-12-2015 à 20:16:16  profilanswer
 

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

n°2271983
rat de com​bat
attention rongeur méchant!
Posté le 19-12-2015 à 23:04:33  profilanswer
 

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.

n°2271995
Dream0386
Posté le 20-12-2015 à 11:03:28  profilanswer
 

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.  

n°2271999
Je@nb
Kindly give dime
Posté le 20-12-2015 à 13:02:08  profilanswer
 

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.

mood
Publicité
Posté le 20-12-2015 à 13:02:08  profilanswer
 

n°2272001
Dream0386
Posté le 20-12-2015 à 13:28:18  profilanswer
 

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

n°2272003
rat de com​bat
attention rongeur méchant!
Posté le 20-12-2015 à 13:40:51  profilanswer
 

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...

n°2272007
Dream0386
Posté le 20-12-2015 à 15:59:09  profilanswer
 

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'

n°2272012
rat de com​bat
attention rongeur méchant!
Posté le 20-12-2015 à 17:30:22  profilanswer
 

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

n°2272017
gilou
Modérateur
Modzilla
Posté le 20-12-2015 à 19:23:56  profilanswer
 

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é!  --
n°2272018
rat de com​bat
attention rongeur méchant!
Posté le 20-12-2015 à 19:28:13  profilanswer
 

typo, ligne 14 c'est certainement $program2

Message cité 1 fois
Message édité par rat de combat le 20-12-2015 à 19:28:27
n°2272019
Je@nb
Kindly give dime
Posté le 20-12-2015 à 19:34:17  profilanswer
 

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. }

n°2272020
Je@nb
Kindly give dime
Posté le 20-12-2015 à 19:36:41  profilanswer
 

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 ?

n°2272021
Dream0386
Posté le 20-12-2015 à 19:54:27  profilanswer
 

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

n°2272022
gilou
Modérateur
Modzilla
Posté le 20-12-2015 à 19:56:24  profilanswer
 

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é!  --
n°2272023
Je@nb
Kindly give dime
Posté le 20-12-2015 à 20:00:53  profilanswer
 

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

n°2272061
Dream0386
Posté le 21-12-2015 à 14:19:45  profilanswer
 

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?

n°2272062
Dream0386
Posté le 21-12-2015 à 14:21:44  profilanswer
 

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?

n°2272082
Je@nb
Kindly give dime
Posté le 21-12-2015 à 16:04:54  profilanswer
 

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

n°2272103
Dream0386
Posté le 21-12-2015 à 18:47:51  profilanswer
 

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
n°2272104
Dream0386
Posté le 21-12-2015 à 19:20:58  profilanswer
 

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?

n°2272109
Je@nb
Kindly give dime
Posté le 21-12-2015 à 21:29:21  profilanswer
 

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. }

n°2272112
Dream0386
Posté le 21-12-2015 à 21:57:14  profilanswer
 

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.
 
?

n°2272113
Je@nb
Kindly give dime
Posté le 21-12-2015 à 22:05:24  profilanswer
 

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

n°2272114
Dream0386
Posté le 21-12-2015 à 22:09:49  profilanswer
 

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

n°2272115
Je@nb
Kindly give dime
Posté le 21-12-2015 à 22:24:26  profilanswer
 

fait voir ta tache planifiée

n°2272129
Dream0386
Posté le 22-12-2015 à 11:03:34  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Fichier batch

 

Sujets relatifs
[Batch] Eteindre les pc de mon reseau a partir d'un fichier texte[RESOLU] Batch - copier des parties d'un fichier texte
Batch de copie de fichier et planificateur de tâcheCommand en batch pour copier -> renommer -> coller un fichier...
[BATCH] Génerer un fichier texte et écrire dedans [...][Shell/Batch] Recherche d'une chaîne de caractère dans un fichier
Batch + nom de fichierBatch Recherche fichier à partir d'une liste et Copier
Appeler label depuis un autre fichier batch[BATCH] Recherche dans un fichier texte
Plus de sujets relatifs à : Fichier batch


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR