Question Lancement Defrag à distance
- michault
- Auteur du sujet
- Hors Ligne
- Membre premium
- Messages : 128
- Remerciements reçus 0
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Faut juste savoir si le mieux est l'ennemi du bienVoilà, c'est sûrement à améliorer et je suis preneur.
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.
- michault
- Auteur du sujet
- Hors Ligne
- Membre premium
- Messages : 128
- Remerciements reçus 0
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
A quelque chose comme ceci :A quoi penses-tu quand tu dis que le paramètrage n'est pas complet?
[code:1]
#Définition des constantes
$domain = \",DC=domaine,DC=fr\"
$Batch=1|select Drive,Path,Name,FullPath
$Batch.Drive,$Batch.Path,$Batch.Name=\"C\",\"BATCH\",\"Defrag+Shutdown.cmd\"
#ou encore
#$Batch=1|select Drive,Path,Name,FullPath |% {$_.Drive,$_.Path,$_.Name=\"C\",\"BATCH\",\"Defrag+Shutdown.cmd\";$_}
$Batch.FullPath=\"$($Batch.Drive):\$($Batch.Path)\$($Batch.Name)\" #ou une méthode
#ensuite
$cmd = \"\C$\$($Batch.Path)\$($Batch.Name)\"
$_.Name + \": $($Batch.Name) trouvé\" | Out-File $log -Append -NoClobber
schtasks /create /tn \"DEFRAG\" /tr \"$($Batch.FullPath)\" /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.
- michault
- Auteur du sujet
- Hors Ligne
- Membre premium
- Messages : 128
- Remerciements reçus 0
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 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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Rien de bien méchant: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.
[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=\"C\",\"BATCH\",\"Defrag+Shutdown.cmd\"
[/code:1]
C'est une affectation multiple en lieu et place de :
[code:1]
$Batch.Drive=\"C\"
$Batch.Path=\"BATCH\"
$Batch.Name=\"Defrag+Shutdown.cmd\"
[/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=\"$($Batch.Drive):\$($Batch.Path)\$($Batch.Name)\" #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:
Oui mais ça tu peux le tester sans risqueau 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?
chm69 écrit:
L'appproche objet facilite la réutilisation...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.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- Lancement Defrag à distance