Question
Erreur : Commands.Internal.Format
- Kreg0
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 6
- Remerciements reçus 0
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.
- Kreg0
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 6
- Remerciements reçus 0
Même résultat
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
[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.
- Kreg0
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 6
- Remerciements reçus 0
Un GRAND merci à toi !!
Merci également pour le post, c'est très clair.
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
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 \"clean\" (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.
- Kreg0
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 6
- Remerciements reçus 0
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 >v4.
J'ai maintenant une erreur de type \"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\"
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 \"Name\" 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
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Erreur : Commands.Internal.Format