2017-04-06 3 views
0

私は、名前を変更する必要があるWindows 10ワークステーションの大規模なセットを持っています。私は以下のスクリプトを実行しようとしましたが、私の現在のPSレベルを超えているエラーを取得します。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 
} 

が生成されます

名前の変更、コンピュータを:パラメータ 'コンピュータ名' で必要な '可能System.String' タイプ に 'のSystem.Object []' に変換できません。指定された メソッドはサポートされていません。 \ siat-d​​s0 \ appdeploy \ LabPacks \ rename-computers \ rename-siat.ps1:4 char:35 +コンピュータ名 - コンピュータ名$ computers.OldName -NewName $ computers.NewName ... + ~~ ~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(:) [名前の変更-コンピュータ]を、ParameterBindingException + FullyQualifiedErrorId:CannotConvertArgument、Microsoft.PowerShell.Commands.RenameComputerCommand

私は受け取っているエラーについて言及することなく、他の場所でこのトピックについて同様の閉じたスレッドを見ました。

答えて

3

あなたが誤ってあなたのループ内代わりループ反復のコレクション変数$computers変数$oldnameを使用して、名前の配列ではなく、単一のものに拡大$computers.NewNameいるので、あなたがエラーを得ましたあなたが見た。あなたはすべてのでループを必要としない、言っ

- 単一のパイプラインが行います。

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

Rename-Computerは、暗黙的に-NewNameパラメータに、各入力オブジェクトのNewNameプロパティをバインドします。

対照的に、入力オブジェクトにComputerNameプロパティがない場合は、-ComputerNameパラメータにアクセスする入力オブジェクトのプロパティを指定する必要があります。
これはスクリプトブロック{ $_.OldName }の機能であり、その中には自動変数$_が手元の入力オブジェクトを表します。

パイプライン入力を受け付けるパラメータを確認するには、
Get-Help -full Rename-Computerの出力を調べてください。詳細およびプログラム的な代替案については、this answerの鉱山を参照してください。

1

あなたは反復ではなく、単数形を使用している:

この代わりに:

foreachの($のコンピュータで$ OLDNAME){

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

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

はこれを試してみてください

}

注: $ oldnameはある時点で1つの値を保持しています。したがって、$コンピュータに存在するコンピュータの数は、oldnameに1つずつ来て、ループ内のアクティビティを実行します。 ループの中で特異な$ oldnameを使用して1つずつ反復する必要があります。

関連する問題