Question Lancement Defrag à distance

Plus d'informations
il y a 15 ans 5 mois #3234 par michault
Comme je l'avais dit, je mets, en toute modestie 2 scripts pour exécuter un defrag sur des machines distantes.

J'ai pratiqué en 2 étapes:

1°/ J'ai dispatché un .cmd et créé un tâche planifiée pourl'éxécuter:

Defrag+Shutdown.cmd
C:\Windows\system32\Defrag.exe c:
Shutdown -s -f -c \"Defrag puis arrêt\"


[code:1]#DispatchDefrag.ps1
# Paramètres: $ouparm :L'Unité d'Organisation dont on veut récupérer les ordinateurs.
# $log : Fichier trace
Param($ouparm,$log)

#Définition des constantes
$domain = \",DC=domaine,DC=fr\"
$cmd = \"\C$\BATCH\Defrag+Shutdown.cmd\"
$tasks = \"\C$\Windows\Tasks\DEFRAG.job\"
$OU= $ouparm + $domain
get-QADComputer -searchRoot $OU | Select-Object Name | where {$_.Name -like 'PC*'} |
ForEach-Object {

$path = \"\\\" + $_.Name + \"\c$\"
$pathcmd = \"\\\" + $_.Name + $cmd
$pathtasks = \"\\\" + $_.Name + $tasks

Get-content -Path $pathcmd -ErrorAction SilentlyContinue | Out-Null
if ($?)
{
$_.Name + \": Defrag+Shutdown.cmd trouvé\" | Out-File $log -Append -NoClobber
Get-Content -Path $pathtasks -ErrorAction SilentlyContinue | Out-Null
if ($?)
{
$_.Name + \": DEFRAG.job trouvé\" | Out-File $log -Append -NoClobber
}
else
{
schtasks /create /tn \"DEFRAG\" /tr \"c:\BATCH\Defrag+Shutdown.cmd\" /s $_.Name /sc once /st 05:00:00 /ru domaine\administrateur /rp motdepasse | Out-Null
$_.Name + \": Copy +Tasks OK\" | Out-File $log -Append -NoClobber
}
}
else
{
Copy-Item \"c:\PWRSHELL\BATCH\\" -Destination $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable Copyerror
if ($?)
{
Get-Content $pathtasks -ErrorAction SilentlyContinue | Out-Null
if ($?)
{
$_.Name + \": DEFRAG.job trouvé\" | Out-File $log -Append -NoClobber
}
else
{
schtasks /create /tn \"DEFRAG\" /tr \"c:\BATCH\Defrag+Shutdown.cmd\" /s $_.Name /sc once /st 05:00:00 /ru domaine\administrateur /rp motdepasse | Out-Null
$_.Name + \": Copy +Tasks OK\" | Out-File $log -Append -NoClobber
}
}
else
{
$_.Name + \": \" + $Copyerror | Out-File $log -Append -NoClobber
}
}
}[/code:1]

2°/ J'ai créé un 2°.cmd qui lance mon second script afin de réveiller les PC et d'éxécuter la tâche Defrag+shutdown créé un tâche planifiée pourl'éxécuter:

RunDefrag.cmd
powershell c:\PWRSHELL\Wol+TasksWithCsv.ps1 -path('C:\PWRSHELL\CSV\Wol+TasksWithCsv.csv') -log'C:\PWRSHELL\logdefrag.txt')

[code:1]#Wol+TasksWithCsv.ps1
# Paramètres: $path : Fichier des Adresses MAC & Ip
# $log : Fichier trace
Param($path, $log)
$var=Import-Csv $path

#Définition des constantes
[int]$Interval = 15
[int]$MaxTries = 10


foreach($v in $var)
{
WakeUpPC $v.Adresse_MAC
$i = 0
While ($PingStatus.StatusCode -ne 0) {
Start-Sleep -Seconds $Interval
$i++
if ($i -lt $MaxTries) {
$PingStatus = Get-WmiObject Win32_PingStatus -Filter (\"Address='\" + $v.IpAdresse + \"'\"«»)
# Write-Host $PingStatus.StatusCode `r
$v.IpAdresse + \" : PingStatus : \" + $PingStatus.StatusCode | Out-File $log -Append -NoClobber
} else {
# Write-Host \"Opération abortée: Nombre de tentative max atteint\"
$v.IpAdresse + \"Opération abortée: Nombre de tentative max atteint\" | Out-File $log -Append -NoClobber
Exit
}
}
Start-Sleep -Seconds $Interval

$IpAdr = [string]$v.IpAdresse
#Write-Host $IpAdr
schtasks /run /tn \"DEFRAG\" /s $IpAdr
if ($?)
{
$v.IpAdresse + \": DEFRAG lancé\" | Out-File $log -Append -NoClobber
}
else
{
$v.IpAdresse + \": Echec lancement DEFRAG\" | Out-File $log -Append -NoClobber
}

}[/code:1]

Voilà, c'est sûrement à améliorer et je suis preneur.;)<br><br>Message édité par: chm69, à: 17/11/08 10:15

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

Plus d'informations
il y a 15 ans 5 mois #3239 par Laurent Dardenne
chm69 écrit:

Voilà, c'est sûrement à améliorer et je suis preneur.

Faut juste savoir si le mieux est l'ennemi du bien :)
A mon avis dans le premier le paramètrage n'est pas complet et dans le second l'instruction Exit me semble ne pas correspondre à ce que tu souhaites faire. N'est-ce pas l'instruction break ?

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 5 mois #3240 par michault
Réponse de michault sur le sujet Re:Lancement Defrag à distance
A quoi penses-tu quand tu dis que le paramètrage n'est pas complet?

Pour le 2° script, je veux passer au PC suivant. Si exit arrête complètement le script, c'est effectivement pas bon. Je vais le remplacer par un break.

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

Plus d'informations
il y a 15 ans 5 mois #3242 par Laurent Dardenne
chm69 écrit:

A quoi penses-tu quand tu dis que le paramètrage n'est pas complet?

A quelque chose comme ceci :
[code:1]
#Définition des constantes
$domain = \&quot;,DC=domaine,DC=fr\&quot;

$Batch=1|select Drive,Path,Name,FullPath
$Batch.Drive,$Batch.Path,$Batch.Name=\&quot;C\&quot;,\&quot;BATCH\&quot;,\&quot;Defrag+Shutdown.cmd\&quot;
#ou encore
#$Batch=1|select Drive,Path,Name,FullPath |% {$_.Drive,$_.Path,$_.Name=\&quot;C\&quot;,\&quot;BATCH\&quot;,\&quot;Defrag+Shutdown.cmd\&quot;;$_}

$Batch.FullPath=\&quot;$($Batch.Drive):\$($Batch.Path)\$($Batch.Name)\&quot; #ou une méthode

#ensuite
$cmd = \&quot;\C$\$($Batch.Path)\$($Batch.Name)\&quot;
$_.Name + \&quot;: $($Batch.Name) trouvé\&quot; | Out-File $log -Append -NoClobber
schtasks /create /tn \&quot;DEFRAG\&quot; /tr \&quot;$($Batch.FullPath)\&quot; /s $_.Name /sc once /st 05:00:00 /ru domaine\administrateur /rp motdepasse | Out-Null
[/code:1]
En cas de modifications du nom du batch tu ne changes que la définition de l'objet ou des string. Les modifications sont répercutées automatiquement.
C'est un peu plus verbeux je te l'accorde

En itérant sur le principe tu peux créer un générateur de tâches.

Et tu ne devrais pas coder en dur le mot de passe.

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 5 mois #3243 par michault
Réponse de michault sur le sujet Re:Lancement Defrag à distance
Entièrement d'accord avec toi.
La semaine prochaine, je jouerais avec -credential.
Par contre, il faut que je décortique ce que tu m'as posté car au niveau syntaxe, c'est pas de mon niveau pour l'instant.

Au fait un break à la place de mon exit devrait docn me permettre de passer au PC suivant si pas de réponse du précédent? oui :laugh: ou non :(

Je dois aussi dans mon 2°script, passer la tasks en paramètre ainsi je pourrais réutiliser le même script quelquesoit la tasks à exécuter.

@+<br><br>Message édité par: chm69, à: 14/11/08 16:31

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

Plus d'informations
il y a 15 ans 5 mois #3245 par Laurent Dardenne
chm69 écrit:

Par contre, il faut que je décortique ce que tu m'as posté car au niveau syntaxe, c'est pas de mon niveau pour l'instant.

Rien de bien méchant:
[code:1]
$Batch=1|select Drive,Path,Name,FullPath
[/code:1]
On crée un objet, là faut connaitre un peu leur principe je te l'accorde.
[code:1]
$Batch.Drive,$Batch.Path,$Batch.Name=\&quot;C\&quot;,\&quot;BATCH\&quot;,\&quot;Defrag+Shutdown.cmd\&quot;
[/code:1]
C'est une affectation multiple en lieu et place de :
[code:1]
$Batch.Drive=\&quot;C\&quot;
$Batch.Path=\&quot;BATCH\&quot;
$Batch.Name=\&quot;Defrag+Shutdown.cmd\&quot;
[/code:1]
Usage d'une variable au sein d'une string, elle sera expansée, c'est à dire que PS reconstruit la chaîne finale, les parenthèses indique d'interpréter ce sous ensemble avant le reste, un appel de fonction en quelque sorte et le dollar indique qu'on récupère une chaine de caractères :
[code:1]
$Batch.FullPath=\&quot;$($Batch.Drive):\$($Batch.Path)\$($Batch.Name)\&quot; #ou une méthode
[/code:1]
Ces principes là une fois qu'on les a compris, on les retrouve partout.
Tu peux vérifier les résultats en enlevant le signe dollar puis en enlevant les parenthèses.
chm69 écrit:

au fait un break à la place de mon exit devrait docn me permettre de passer au PC suivant si pas de réponse du précédent?

Oui mais ça tu peux le tester sans risque :)
chm69 écrit:

Je dois aussi dans mon 2°script, passer la tasks en paramètre ainsi je pourrais réutiliser le même script quelquesoit la tasks à exécuter.

L'appproche objet facilite la réutilisation...

Tutoriels PowerShell

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

Temps de génération de la page : 0.080 secondes
Propulsé par Kunena