PowerShell参数或参数
我有一个脚本来重命名网络上的计算机。我正在尝试更改它,以便可以输入计算机的当前名称和新名称作为参数或参数(在本例中有意义)。此外,我希望脚本检查参数,如果参数不存在,则导入CSV文件 这是我想到的,它不起作用。控制台输出中的param似乎为空,但IF语句的运行方式与它们的运行方式相同PowerShell参数或参数,powershell,Powershell,我有一个脚本来重命名网络上的计算机。我正在尝试更改它,以便可以输入计算机的当前名称和新名称作为参数或参数(在本例中有意义)。此外,我希望脚本检查参数,如果参数不存在,则导入CSV文件 这是我想到的,它不起作用。控制台输出中的param似乎为空,但IF语句的运行方式与它们的运行方式相同 param ( $o = "oldname", $n = "newname" ) if(!($o = $null)){ if(!($n = $null)){ Write-H
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
}
}
您正在if语句中将
$o
和$n
赋值给$null
,而不是对其进行比较。您可以检查$o
是否为空,如下所示:
if($o)
{
}
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
}
但是,由于您正在比较一个字符串,因此可能需要使用静态的[string]::IsNullOrEmpty
方法检查该字符串是null还是空的。因此,重构后的代码可能如下所示:
if($o)
{
}
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
}
这几乎是使用
[CmdletBinding()]
和[参数(强制=$true)]
或[参数(valuefrompipline=$true)]
的理想情况。有关更多信息,请参阅。(您也可以通过Powershell控制台或ISE中的get Help about_Functions\u Advanced_Parameters
获取此信息。)@JeffZeitlin他的脚本正在从csv导入新名称和旧名称,以防未指定参数。他为什么要使用强制性或valuefrompipeline属性?@MartinBrandl-注意点。实际上,我会用以下两种方法之一重写它:(1)两个参数集-一个用于提供计算机名,另一个用于从文件导入它们,或者(2)ValueFromPipeline,然后使用import CSV$csvfile>调用它,这个脚本
。它最终变得更加灵活(我没有被锁定到特定的CSV文件名),代码可能更容易调试-在某种程度上,任何调试首先都是必要的。@JeffZeitlin同意,这将是一个更好的函数,而不是在脚本中神奇地执行它。如果要添加密码作为参数。我可以在参数列表的顶部添加$password吗?当然可以。