Question Erreur : Commands.Internal.Format

Plus d'informations
il y a 8 ans 11 mois #23380 par Kreg0
Salut les gars

J'ai besoin de votre aide :)

J'ai un script basique que je souhaite utiliser pour une migration de drivers d'imprimantes.

Le script fonctionne correctement sur les ordinateurs exécutant powershell v4 ou v5, mais à ma grande surprise le script ne fonctionne pas sur du powershell v2 équipant mes postes Windows 7.
Et bien sûr, j'ai environ 2000 ordinateurs avec cette ancienne version.

Je ne comprends pas pourquoi j'obtiens une erreur, à ma connaissance je n'utilise pas de commande spécifique à la nouvelle version.

L'erreur que j'ai :

The object of type \"Microsoft.PowerShell.Commands.Internal.Format.FormatStartData\" is not valid or not in the correct sequence. This is likely caused by a user-specified \"format-table\" command which is conflicting with the default formatting.
+ CategoryInfo : InvalidData: (:) [out-lineoutput], InvalidOperationException
+ FullyQualifiedErrorId : ConsoleLineOutputOutOfSequencePacket,Microsoft.PowerShell.Commands.OutLineOutputCommand


Mon script :
[code:1]$DateFormat = Get-Date -Format \"yyyyMMdd_HHmmss\"
$logPath = \"C:\windows\hgw\PrinterDriverUpdate\"
if (!(Test-Path $logPath))
{
New-Item $logPath -ItemType container -ErrorAction stop | Out-Null
}
$logfile = Join-Path $logPath (\"printer_driver_update\" + $DateFormat + \".log\"«»)

$oldprinterlistfile = \".\listprinter.txt\"
$oldprinterlist = Import-Csv $oldprinterlistfile
$localprinterlist = get-wmiobject -class Win32_printer
$driver = \"Canon Generic PCL6 Driver\"
$totalprinter = 0
$totalerror = 0
$totalupdates = 0
$totalnoncorporateprinter = 0



#
# SCRIPT
#


$startedAt = Get-Date -Format \"yyyyMMdd_HHmmss\"

\"`r`n$(); STARTING PRINTER DRIVER UPDATE\" | Out-File $logfile -Append


$testdriverpresence = Get-WmiObject -Class win32_printerdriver | where {($_.name -like \"*Canon Generic PCL6 Driver*\"«»)}
if ($testdriverpresence -eq $null)
{
$command1 = 'cscript C:\Windows\System32\Printing_Admin_Scripts\en-US\prndrvr.vbs -a -m \"Canon Generic PCL6 Driver\"'
Invoke-Expression $command1
}




$testdriverpresenceaftervbs = Get-WmiObject -Class win32_printerdriver | where {($_.name -like \"*Canon Generic PCL6 Driver*\"«»)}
if ($testdriverpresenceaftervbs -eq $null)
{
\"$startedAt ; [ERR] Printer Driver not present in the OS please process manually\" | Out-File $logfile -append
}
else
{
foreach ($localprinter in $localprinterlist)
{
$totalprinter++
$printername = $localprinter.name
$controlprinter = $oldprinterlist | where {$_.nom -like \"*$printername*\"}

if (!$controlprinter)
{
$totalnoncorporateprinter++
\"$startedAt ; [INF] Printer $printername is not present in printer DB, no change will be applied\" | Out-File $logfile -append
}
else
{
$ip = $controlprinter.ip
\"$startedAt ; [INF] Printer $printername is present in printer DB, updates will be done\" | Out-File $logfile -append
$printer = Get-WmiObject win32_printer -filter \"name = '$printername'\"
$printer | sort name | ft name, drivername
$printer | % {
$printer.DriverName = \"Canon Generic PCL6 Driver\"
$printer.Put()
}



$control = Get-WmiObject -Class win32_driverfordevice | where {($_.__relpath -like \"*$printername*\"«») -and ($_.__relpath -like \"*Canon Generic PCL6 Driver*\"«»)}

if (!$control)
{
$totalerror++
\"$startedAt ; [ERR] PrinterDRiver was not updated on printer $printername\" | Out-File $logfile -append
\"$startedAt ; [ERR] Please handel manually the issue\" | Out-File $logfile -append

}
else
{
$totalupdates++
\"$startedAt ; [INF] PrinterDRiver was updated on printer $printername\" | Out-File $logfile -append
New-itemproperty -path HKLM:\SOFTWARE\DriverUp\apps -name \"DriverUpdate\" -value \"1.0\" -force
}



}

}
}
\"$startedAt ; Script finish with following Statistic :\" | Out-File $logfile -append
\" Printer Found : $totalprinter\" | Out-File $logfile -append
\" Printer updated : $totalupdates\" | Out-File $logfile -append
\" Printer Updated Errors: $totalerror\" | Out-File $logfile -append
\" Non Corporate Printer: $totalnoncorporateprinter\" | Out-File $logfile -append

[/code:1]

Si quelqu'un à une idée je suis preneur !!
Un grand merci :)

Kreg

Message édité par: Kreg, à: 24/03/17 20:32

Message édité par: Kreg, à: 25/03/17 23:47<br><br>Message édité par: Kreg, à: 27/03/17 18:46

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

Plus d'informations
il y a 8 ans 11 mois #23382 par Kreg0
Réponse de Kreg0 sur le sujet Re:Erreur : Commands.Internal.Format
Pour info, j'ai déjà testé en enlevant les références lié à $Date et même en supprimant la partie Log.
Même résultat :(

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

Plus d'informations
il y a 8 ans 11 mois #23383 par Laurent Dardenne
Ajoute un out-string ici :
[code:1]
$printer | sort name | ft name, drivername| Out-String
[/code:1]
cette ligne renvoi qq chose ?
[code:1]
Invoke-Expression $command1
[/code:1]
voir ce post

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 11 mois #23384 par Kreg0
Réponse de Kreg0 sur le sujet Re:Erreur : Commands.Internal.Format
J'ai rajouté un out-string, et cela fonctionne parfaitement !!!!

Un GRAND merci à toi !! :)
Merci également pour le post, c'est très clair.

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

Plus d'informations
il y a 8 ans 11 mois #23392 par Arnaud Petitjean
Hello Kreg !

Désolé j'arrive après la bataille...

Juste deux petites choses. La première est qu'il faut éviter d'utiliser des commandes de formatage de type Format-List, Format-Table, etc. dans un script. En effet cela a pour effet de dénaturer complètement ton objet de départ. Il est mieux d'exporter tes données autrement, un fichier CSV par exemple.

Deuxième chose, je vois que tu t'es crée une petite fonction de logs personnalisée très simple. Celle-ci ressemble un peu à mon module EZLog ( voir sur la page d'accueil ). Je pense que tu devrais le regarder car il pourrait t'aider à faire d'une pierre deux coups; c'est à dire garder un code \&quot;clean\&quot; (juste les fonctions métier) et avoir des fichiers de logs bien structurés.

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 8 ans 11 mois #23399 par Kreg0
Réponse de Kreg0 sur le sujet Re:Erreur : Commands.Internal.Format
Il n'est jamais trop tard :)
Et merci pour EZLog, je vais tester cela.

En revanche de mon côté j'ai encore des erreurs dans certains cas. Décidément il faut absolument que mon parc s'upgrade en POwershell &gt;v4.

J'ai maintenant une erreur de type \&quot;The OS handle's position is not what FileStream expected. Do not use a handle simultaneously in one FileStream and in Win32 code or another FileStream\&quot;

Vu que j'ai un besoin assez urgent j'ai simplifié à fond le script. Plus de log, plus de clé de registre... Mais toujours pareil.

Du coup j'essai encore de faire plus simple mais je n'y arrive pas. Je voudrais mettre à jour le driver sur toutes les imprimantes présentes en fonction d'un seul critère (Manufacturer = Canon ou driver name like Canon) et ensuite le remplacer par mon driver PCL6 Canon.
Mais ça je ne sais pas comment faire. A la base j'avais un ficher d'input contenant le \&quot;Name\&quot; de l'imprimante. Mais me basé sur autre chose que le nom je n'y arrive pas...
Une idée ?
Au final j'arrive a moins de 10 lignes de scripts mais je ne m'en sors pas :blink:

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

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