Question
Extinction machines depuis fichier texte
- LeLyon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 14 ans 5 mois #10334
par LeLyon
Commence en douceur à se convertir du DOS au PowerShell
Extinction machines depuis fichier texte a été créé par LeLyon
Bonjour à tous, c'est mon premier message, et le premier script powershell que je commence.
J'avais déjà réaliser ce script en dos qui fonctionnait parfaitement, mais voila avec Windows Server 2008R2 cela ne fonctionne plus. C'est donc une bonne occasion pour que je me mette au powershell !
Le but de mon script est d'éteindre à distance les machines qui se trouve dans un fichier txt.
Voici le code de mon script en DOS qui fonctionne :
[code:1]
for /F %%i IN (\"chemin_fichier_contenant_machines.txt\"«») DO (
PING -n 1 -w 1000 %%i | FIND \"TTL=\">NUL
IF NOT ERRORLEVEL 1 (
shutdown -f -s -t 10 -m \\%%i
echo %date% ; %time% ; %%i >> \"chemin_fichier_contenant_inventaire_machines_eteintes.csv\"
)
)
[/code:1]
Et après plusieurs heures/jours de recherches et de travail voici un équivalent que j'ai réalisé en powershell qui fonctionne :
[code:1]
$machines = \"chemin_fichier_contenant_machines.txt\"
$log = \"chemin_fichier_contenant_inventaire_machines_eteintes.csv\"
gc $machines | foreach-object {
$pc = $_
PING -n 1 -w 1000 $pc | where-object {$_ -match 'TTL=NUL'}
if ($?) {
((gwmi win32_operatingsystem -ComputerName $pc).Win32Shutdown(1))
Add-Content -Path $log -Value (((get-date -format g) -replace \" \",\" ; \"«») + \" ; \" + $pc)
}
}
[/code:1]
Je voulais savoir, s'il était possible de simplifier ou d'améliorer mon script avec le même résultat?
J'aimerai réaliser un script similaire avec la possibilité de personnaliser l'option de Win32Shutdown() avec une interaction qui me demande si je veux fermer la session, éteindre, ou redémarrer.
Ce qui me manque en fait, c'est l'équivalent de la fonction \"SET /A\" en DOS ?
Y aurait il un expert pour me repondre ?
Merci d'avance
J'avais déjà réaliser ce script en dos qui fonctionnait parfaitement, mais voila avec Windows Server 2008R2 cela ne fonctionne plus. C'est donc une bonne occasion pour que je me mette au powershell !
Le but de mon script est d'éteindre à distance les machines qui se trouve dans un fichier txt.
Voici le code de mon script en DOS qui fonctionne :
[code:1]
for /F %%i IN (\"chemin_fichier_contenant_machines.txt\"«») DO (
PING -n 1 -w 1000 %%i | FIND \"TTL=\">NUL
IF NOT ERRORLEVEL 1 (
shutdown -f -s -t 10 -m \\%%i
echo %date% ; %time% ; %%i >> \"chemin_fichier_contenant_inventaire_machines_eteintes.csv\"
)
)
[/code:1]
Et après plusieurs heures/jours de recherches et de travail voici un équivalent que j'ai réalisé en powershell qui fonctionne :
[code:1]
$machines = \"chemin_fichier_contenant_machines.txt\"
$log = \"chemin_fichier_contenant_inventaire_machines_eteintes.csv\"
gc $machines | foreach-object {
$pc = $_
PING -n 1 -w 1000 $pc | where-object {$_ -match 'TTL=NUL'}
if ($?) {
((gwmi win32_operatingsystem -ComputerName $pc).Win32Shutdown(1))
Add-Content -Path $log -Value (((get-date -format g) -replace \" \",\" ; \"«») + \" ; \" + $pc)
}
}
[/code:1]
Je voulais savoir, s'il était possible de simplifier ou d'améliorer mon script avec le même résultat?
J'aimerai réaliser un script similaire avec la possibilité de personnaliser l'option de Win32Shutdown() avec une interaction qui me demande si je veux fermer la session, éteindre, ou redémarrer.
Ce qui me manque en fait, c'est l'équivalent de la fonction \"SET /A\" en DOS ?
Y aurait il un expert pour me repondre ?
Merci d'avance
Commence en douceur à se convertir du DOS au PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 14 ans 5 mois #10335
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extinction machines depuis fichier texte
Salut,
lelyon écrit:
[code:1]
[int]$I=10
[/code:1]
Pour ton code tu peux utiliser Test-Connection ce qui t'éviteras le parsing de chaîne. Reste à vérifier si le comportement que tu souhaites est identique.
Pour l'appel à gwmi, il est préférable de scinder ton appel.En cas de debug tu pourras déterminer si c'est WMI ou l'appel à la méthode qui pose pb.
Le service WMI peut être actif en local, mais pas sur le distant.
Et pour finir l'ajout dans le fichier via Add-Content peut être optimisé. Avec ton approche tu ouvres et fermes le fichier n fois, si tu émets dans le pipe ta chaîne puis ajoute l'appel à Add-Content dans le 'pipe finale' tu crées le fichier en une fois.
[code:1]$machines = \"chemin_fichier_contenant_machines.txt\"
$log = \"chemin_fichier_contenant_inventaire_machines_eteintes.csv\"
gc $machines |
foreach-object {
$pc = $_
if (Test-Connection -Quiet)
{
$Distant=gwmi win32_operatingsystem -ComputerName $pc
$Distant.Win32Shutdown(1)
((get-date -format g) -replace \" \",\" ; \"«») + \" ; \" + $pc
}
}|
Add-Content -Path $log [/code:1]
Ensuite, si tu comptes effectuer d'autres traitements à partir de ton fichier, il te faudra de nouveau le parser. L'usage d'un objet t'éviterait cela...
lelyon écrit:
Il faut utiliser une variable typée :Ce qui me manque en fait, c'est l'équivalent de la fonction \"SET /A\" en DOS ?
[code:1]
[int]$I=10
[/code:1]
Pour ton code tu peux utiliser Test-Connection ce qui t'éviteras le parsing de chaîne. Reste à vérifier si le comportement que tu souhaites est identique.
Pour l'appel à gwmi, il est préférable de scinder ton appel.En cas de debug tu pourras déterminer si c'est WMI ou l'appel à la méthode qui pose pb.
Le service WMI peut être actif en local, mais pas sur le distant.
Et pour finir l'ajout dans le fichier via Add-Content peut être optimisé. Avec ton approche tu ouvres et fermes le fichier n fois, si tu émets dans le pipe ta chaîne puis ajoute l'appel à Add-Content dans le 'pipe finale' tu crées le fichier en une fois.
[code:1]$machines = \"chemin_fichier_contenant_machines.txt\"
$log = \"chemin_fichier_contenant_inventaire_machines_eteintes.csv\"
gc $machines |
foreach-object {
$pc = $_
if (Test-Connection -Quiet)
{
$Distant=gwmi win32_operatingsystem -ComputerName $pc
$Distant.Win32Shutdown(1)
((get-date -format g) -replace \" \",\" ; \"«») + \" ; \" + $pc
}
}|
Add-Content -Path $log [/code:1]
Ensuite, si tu comptes effectuer d'autres traitements à partir de ton fichier, il te faudra de nouveau le parser. L'usage d'un objet t'éviterait cela...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- LeLyon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 14 ans 5 mois #10337
par LeLyon
Commence en douceur à se convertir du DOS au PowerShell
Réponse de LeLyon sur le sujet Re:Extinction machines depuis fichier texte
Bonjour, merci de ta réponse précise et rapide. 
J'ai compris les modifications que tu me proposes, et cela correspond à ce que j'attendais.
Par contre dans mon fichier .csv d'inventaire il m'affiche désormais une ligne supplémentaire :
Exemple :
[code:1]System.Management.ManagementBaseObject
29/09/2011 ; 14:32 ; WKS-TEST-01
[/code:1]
Quand je ne redirige pas le résultat dans le fichier, dans la console je n'ai pas cette ligne \"System.Management.ManagementBaseObject\".
Serait-se du à un argument manquant de la commande add-content ?
Sinon mon fichier csv me sert uniquement de fichier de log, pour être consulté et trié plus facilement dans un tableur.
Concernant un équivalent à la commande SET /A, j'ai trouvé la commande \"read-host\" qui me permet d'afficher une question et de récuper la valeur saisie dans une variable.
Encore merci de me consacrer un peu de ton temps:P
J'ai compris les modifications que tu me proposes, et cela correspond à ce que j'attendais.
Par contre dans mon fichier .csv d'inventaire il m'affiche désormais une ligne supplémentaire :
Exemple :
[code:1]System.Management.ManagementBaseObject
29/09/2011 ; 14:32 ; WKS-TEST-01
[/code:1]
Quand je ne redirige pas le résultat dans le fichier, dans la console je n'ai pas cette ligne \"System.Management.ManagementBaseObject\".
Serait-se du à un argument manquant de la commande add-content ?
Sinon mon fichier csv me sert uniquement de fichier de log, pour être consulté et trié plus facilement dans un tableur.
Concernant un équivalent à la commande SET /A, j'ai trouvé la commande \"read-host\" qui me permet d'afficher une question et de récuper la valeur saisie dans une variable.
Encore merci de me consacrer un peu de ton temps:P
Commence en douceur à se convertir du DOS au PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 14 ans 5 mois #10338
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extinction machines depuis fichier texte
lelyon écrit:
Il se peut que l'appel de la méthode renvoi un objet, essaie ceci:
[code:1][void]$Distant.Win32Shutdown(1)[/code:1]
lelyon écrit:
Chacun utilises les outils qu'il juge les plus appropriés
C'est vrai que je n'ai pas testé...Quand je ne redirige pas le résultat dans le fichier, dans la console je n'ai pas cette ligne \"System.Management.ManagementBaseObject\".
Il se peut que l'appel de la méthode renvoi un objet, essaie ceci:
[code:1][void]$Distant.Win32Shutdown(1)[/code:1]
lelyon écrit:
Ok, bien que PS propose Sort-Object et Out-GridView.Sinon mon fichier csv me sert uniquement de fichier de log, pour être consulté et trié plus facilement dans un tableur.
Chacun utilises les outils qu'il juge les plus appropriés
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- LeLyon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 3
- Remerciements reçus 0
il y a 14 ans 5 mois #10348
par LeLyon
Commence en douceur à se convertir du DOS au PowerShell
Réponse de LeLyon sur le sujet Re:Extinction machines depuis fichier texte
Bonjour,
merci ça fonctionne parfaitement avec l'ajout de \"[void]\".
merci ça fonctionne parfaitement avec l'ajout de \"[void]\".
Commence en douceur à se convertir du DOS au PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.043 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Extinction machines depuis fichier texte