2017-01-31 7 views
1

ネットワーク上のコンピュータの名前を変更するスクリプトがあります。私はそれを変更しようとしていますので、現在の名前とマシンの新しい名前を引数またはパラメータとして入力することができます(この場合は理にかなっています)。また、スクリプトで引数をチェックしてください存在しないCSVファイルをインポートします。PowerShellの引数またはパラメータ

これは私が思い付いたし、それが動作していないものです。 paramはコンソール出力から空に見えますが、IF文はまるでそうでないかのように動作します。

param (
    $o = "oldname", 
    $n = "newname" 
) 

if(!($o = $null)){ 
    if(!($n = $null)){ 
     Write-Host "Renaming computer from: $o to: $n" 
     netdom renamecomputer $o /newName:$n /uD:domain\user /passwordD:* /force /reboot 
    } 
}else{ 
    Write-Host "Importing Computers from CSV file" 
    $csvfile = "C:\Sysinternals\rename.csv" 
    Import-Csv $csvfile | foreach { 
     $oldName = $_.OldName; 
     $newName = $_.NewName; 

     Write-Host "Renaming computer from: $oldName to: $newName" 
     netdom renamecomputer $oldName /newName:$newName /uD:domain\username /passwordD:* /force /reboot 
    } 
} 
+2

これは、使用のために非常に近い理想的なケースである '[CmdletBinding()]'と '[パラメータ(必須= $真)]'や '[パラメータ( ValueFromPipeline = $ true)] 'となります。詳細については、[About_Functions_Advanced_Parameters](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_functions_advanced_pa​​rameters)を参照してください。 (また、 'は、Get-ヘルプPowerShellコンソールでabout_Functions_Advanced_Parameters'またはISEで、この情報を得ることができます。) –

+0

彼のスクリプトはパラメータが指定されていない場合は、CSVから新しいとOLDNAMEを輸入している@JeffZeitlin。なぜ彼は必須またはvaluefrompipeline属性を使用する必要がありますか? –

+0

@MartinBrandl - 取得ポイント。私は実際には2つの方法のいずれかでこれを書き直してしまいます:(1)コンピュータ名を指定するときと、ファイルからインポートするとき(2)ValueFromPipelineの2つのパラメータセットそれは 'Import-CSV $ csvfile |このスクリプト。それはより柔軟になり(私は特定のCSVファイル名にロックされていません)、コードはおそらくデバッグがより簡単になります - 最初にデバッグが必要になるほどで​​す。 –

答えて

3

あなたはあなたのif文で$nullから$o$nを割り当てる代わりに - にそれを比較します。あなたは$oはこのようなnullであるかどうかを確認することができます。

if($o) 
{ 
} 

しかし、あなたは文字列を比較しているので、おそらく文字列がnullまたは静的[string]::IsNullOrEmptyメソッドを使用して、空であるかどうかを確認したいです。だからあなたのリファクタリング、コードは次のようになります。

param (
    $o = "oldname", 
    $n = "newname" 
) 

if ([string]::IsNullOrEmpty($o) -or [string]::IsNullOrEmpty($n)) 
{ 
    Write-Host "Importing Computers from CSV file" 
    $csvfile = "C:\Sysinternals\rename.csv" 
    Import-Csv $csvfile | foreach { 
     $oldName = $_.OldName; 
     $newName = $_.NewName; 

     Write-Host "Renaming computer from: $oldName to: $newName" 
     netdom renamecomputer $oldName /newName:$newName /uD:domain\username /passwordD:* /force /reboot 
    } 
} 
else 
{ 
    Write-Host "Renaming computer from: $o to: $n" 
    netdom renamecomputer $o /newName:$n /uD:domain\user /passwordD:* /force /reboot 
} 
+0

を入力します。 paramリストの一番上に$パスワードを追加するだけですか? –

+0

そうすることができます。 –

関連する問題