Question [Résolu] Exécution de commandes sur server distant

Plus d'informations
il y a 16 ans 1 semaine #6355 par Arnaud Petitjean

Alors j'ai bien le résultat que je cherche
Pq

invoke-command -scriptblock{$pcommand}


ne veut pas m'exécuter la commande et m'affiche son contenu?


Peut-être parce qu'il faut forcer l'interpréteur PowerShell en mode commande.

Essaie comme ça :

[code:1]
invoke-command -scriptblock{& $pcommand}[/code:1]

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 16 ans 1 semaine #6356 par brutosaure
Effectivement quand je mets & avant mavariable, il ne m'affiche plus le contenu, mais j'ai cette erreur.

[code:1]The term 'Get-ChildItem -path d:\Logs\IIS -recurse | where-object{($_.LastWriteTime -ge [datetime]::«»ParseExact(4/3/2010:00:01,'d/M/yyyy:HH:mm',$null)) -and ($_.LastWriteTi
me -le [datetime]::«»ParseExact(07/3/2010:23:59,'d/M/yyyy:HH:mm',$null))}' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the s
pelling of the name, or if a path was included, verify that the path is correct and try again.
+ CategoryInfo : ObjectNotFound: (Get-ChildItem -...HH:mm',$null))}:«»String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException[/code:1]


Message édité par: brutosaure, à: 12/03/10 12:45<br><br>Message édité par: brutosaure, à: 12/03/10 12:45

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

Plus d'informations
il y a 16 ans 1 semaine #6357 par Arnaud Petitjean
Visiblement tu as quelques soucis de syntaxe.

Tu dois passer à la variable $command un bloc et non pas une chaine. Utilise à la place des guillemets, des accolades. Ensuite, vire les accolades pour ton appel à Invoke-Command.

J'ai testé ça et ça fonctionne chez moi :

[code:1]
$command= { Get-ChildItem -path $path -recurse | where-object{($_.LastWriteTime -ge [datetime]::«»ParseExact($startDate,'d/M/yyyy:HH:mm',$null)) -and ($_.LastWriteTime -le [datetime]::«»ParseExact($endDate,'d/M/yyyy:HH:mm',$null))} }

invoke-command -scriptblock $command
[/code:1]

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 16 ans 1 semaine #6358 par brutosaure
Effectivement en local pas de problème.
Mais impossible de lancer cette commande sur un serveur distant.
Toi tu as testé en local, chez moi aussi ca fonctionne en local.

Du moins via une variable, quand je mets la commande tel quelle dans invoke-command, ca fonctionne.<br><br>Message édité par: brutosaure, à: 12/03/10 14:44

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

Plus d'informations
il y a 16 ans 1 semaine #6361 par Arnaud Petitjean
Je pense qu'il faudrait s'y prendre autrement; je m'explique.

Lorsqu'on utilise le remoting, en général on prend un script qui fonctionne bien localement et on l'exécute sans le modifier sur une machine distante avec la commande Invoke-Command.

Exemple de code qui fonctionne :
[code:1]
# Brutosaure.ps1
param([datetime]$startDate,[datetime]$endDate,[string]$path,[string]$server)

#Import the crypted text file for login and password
#$user = ./import-credential.ps1 C:\chemin.txt

$command= { Get-ChildItem -path $path -recurse | where-object { (($_.LastWriteTime -ge $startDate) -and ($_.LastWriteTime -le $endDate)) } }
Invoke-Command -scriptblock $command
[/code:1]

Le Invoke-Command est même presque de trop car on pourrait simplement mettre le contenu de la variable $command directement.

Ensuite on appelle ce script ainsi pour l'exécuter sur une machine distante :
[code:1]
PS &gt; Invoke-Command -computer W2K3R2SRV -FilePath C:\scripts\brutosaure.ps1 -argumentlist '03/07/2009','03/13/2010','c:\temp'[/code:1]

Ainsi peux aussi passer un tableau d'ordinateurs au paramètre Computer et ton script s'exécutera sur un ensemble de machines. Le résultat sera de la forme suivante :

[code:1]
Répertoire : C:\temp


Mode LastWriteTime Length Name PSComputerName
----

----
d---- 28/08/2009 19:52 Rep de test w2k3r2srv[/code:1]

Tu trouveras une colonne de résultat de plus, celle nommée PSComputerName qui contiendra le nom de la machine à laquelle le résultat se rapporte.

L'autre approche possible serait d'attaquer directement le filesystem d'une machine distante comme ceci :
[code:1]
PS &gt; Get-Childitem \\W2K3R2SRV\c$\temp | where {...}[/code:1]

Ca fonctionne aussi très bien, et ainsi tu n'as pas besoin d'avoir PowerShell installé sur la machine distante.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 16 ans 1 semaine #6364 par brutosaure
Merci Arnaud et aux autres, je vais creuser pour cette approche.
Je crois que tu as raison, ce sera plus efficace ;-)

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

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