Question Extinction machines depuis fichier texte

Plus d'informations
il y a 14 ans 5 mois #10334 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 !:P

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 :B)
[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 ?:blush:
Merci d'avance

Commence en douceur à se convertir du DOS au PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 5 mois #10335 par Laurent Dardenne
Salut,
lelyon écrit:

Ce qui me manque en fait, c'est l'équivalent de la fonction \"SET /A\" en DOS ?

Il faut utiliser une variable typée :
[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.

Plus d'informations
il y a 14 ans 5 mois #10337 par LeLyon
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\". :blink:

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.

Plus d'informations
il y a 14 ans 5 mois #10338 par Laurent Dardenne
lelyon écrit:

Quand je ne redirige pas le résultat dans le fichier, dans la console je n'ai pas cette ligne \"System.Management.ManagementBaseObject\". :blink:

C'est vrai que je n'ai pas testé...
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:

Sinon mon fichier csv me sert uniquement de fichier de log, pour être consulté et trié plus facilement dans un tableur.

Ok, bien que PS propose Sort-Object et Out-GridView.
Chacun utilises les outils qu'il juge les plus appropriés :)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 5 mois #10348 par LeLyon
Bonjour,

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
Propulsé par Kunena