Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell参数或参数_Powershell - Fatal编程技术网

PowerShell参数或参数

PowerShell参数或参数,powershell,Powershell,我有一个脚本来重命名网络上的计算机。我正在尝试更改它,以便可以输入计算机的当前名称和新名称作为参数或参数(在本例中有意义)。此外,我希望脚本检查参数,如果参数不存在,则导入CSV文件 这是我想到的,它不起作用。控制台输出中的param似乎为空,但IF语句的运行方式与它们的运行方式相同 param ( $o = "oldname", $n = "newname" ) if(!($o = $null)){ if(!($n = $null)){ Write-H

我有一个脚本来重命名网络上的计算机。我正在尝试更改它,以便可以输入计算机的当前名称和新名称作为参数或参数(在本例中有意义)。此外,我希望脚本检查参数,如果参数不存在,则导入CSV文件

这是我想到的,它不起作用。控制台输出中的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
    }
}

您正在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吗?当然可以。