2017-04-06 1 views
0

J'ai un grand nombre de postes de travail Windows 10 qui doivent être renommés. J'ai essayé d'exécuter le script ci-dessous, mais je reçois des erreurs qui dépassent mon niveau actuel de PS.Comment renommer à distance une liste d'ordinateurs via PowerShell?

$computers = Import-Csv "c:\rename-computers\computers.csv" 
foreach ($oldname in $computers){ 
    #Write-Host "EmpID=" + $computers.NewName 
    Rename-Computer -ComputerName $computers.OldName -NewName $computers.NewName -DomainCredential hole\inwall -Force -Restart 
} 

Produit:

Rename-ordinateur: Impossible de convertir 'System.Object []' du type 'System.String' requise par le paramètre 'ComputerName'. La méthode spécifiée n'est pas prise en charge. À \ siat-ds0 \ appdeploy \ LabPacks \ rename-ordinateurs \ rename-siat.ps1: 4 char: 35 + Rename-Computer -ComputerName $ computers.OldName -NomName $ computers.NomName ... + ~~ ~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [Renommer l'ordinateur], ParameterBindingException + FullyQualifiedErrorId: CannotConvertArgument, Microsoft.PowerShell.Commands.RenameComputerCommand

J'ai vu des fils fermés similaires sur ce sujet ailleurs sans mention de l'erreur que je reçois.

Répondre

3

Vous a utilisé par erreur la collection variables $computers au lieu de la variable boucle itération $oldname dans votre boucle, et depuis $computers.NewName étendu à un tableau des noms plutôt qu'un seul, vous avez l'erreur vous avez vu.

Cela dit, vous ne pas besoin d'une boucle à tous - un seul pipeline fera:

Import-Csv "c:\rename-computers\computers.csv" | 
Rename-Computer -ComputerName { $_.OldName } -DomainCredential hole\inwall -Force -Restart 

Rename-Computer se lier implicitement la propriété NewName de chaque objet d'entrée au paramètre -NewName.

Le paramètre -ComputerName, en revanche, doit indiquer à quelle propriété sur les objets d'entrée accéder, étant donné que les objets d'entrée n'ont aucune propriété ComputerName.
C'est ce que fait le bloc de script { $_.OldName }, à l'intérieur duquel la variable automatique $_ représente l'objet d'entrée à portée de main.

Pour voir quels paramètres accepter l'entrée de pipeline, examiner la sortie de
Get-Help -full Rename-Computer; Pour plus de détails et une alternative programmatique, voir this answer du mien.

1

YOu itérez mais pas en utilisant le singulier:

Au lieu de cela:

foreach ($oldname in $computers){ 
    #Write-Host "EmpID=" + $computers.NewName 
    Rename-Computer -ComputerName $computers.OldName -NewName $computers.NewName -DomainCredential hole\inwall -Force -Restart 
} 

Essayez ceci:

foreach ($ oldname dans les ordinateurs $) {

Rename-Computer -ComputerName $oldname.OldName -NewName $oldname.NewName -DomainCredential hole\inwall -Force -Restart 

}

Remarque: $ oldname contient une valeur à un point. Ainsi, le nombre d'ordinateurs présents dans les ordinateurs $ arrivera un par un à $ oldname et effectuera l'activité à l'intérieur de la boucle. Vous devriez utiliser l'ancien $ singulier dans la boucle pour l'itérer un par un.