Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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_Class_Types_Constructor_Overloading - Fatal编程技术网

Powershell构造函数中是否按类型重载?

Powershell构造函数中是否按类型重载?,powershell,class,types,constructor,overloading,Powershell,Class,Types,Constructor,Overloading,我想知道是否有可能在Powershell中创建一个包含两个构造函数的类,这两个构造函数都接受相同数量的参数,但它们的类型不同。例如,我想创建如下内容: 类用户{ [字符串]$GivenName [字符串]$姓氏 [字符串]$DisplayName [字符串]$公司 [字符串]$PayrollNo [字符串]$Email [日期时间]$StartDate [DateTime]$LeaveDate 用户([Microsoft.ActiveDirectory.Management.ADAccount]

我想知道是否有可能在Powershell中创建一个包含两个构造函数的类,这两个构造函数都接受相同数量的参数,但它们的类型不同。例如,我想创建如下内容:

类用户{
[字符串]$GivenName
[字符串]$姓氏
[字符串]$DisplayName
[字符串]$公司
[字符串]$PayrollNo
[字符串]$Email
[日期时间]$StartDate
[DateTime]$LeaveDate
用户([Microsoft.ActiveDirectory.Management.ADAccount]$ADUser){
$this.GivenName=$ADUser.GivenName
$this.lasname=$ADUser.lasname
$this.DisplayName=$ADUser.Name
$this.PayrollNo=$ADUser.EmployeeID
$this.Email=$ADUser.EmailAddress
}
用户([System.Array]$TraceUser){
$this.GivenName=$TraceUser'First Name'
$this.lasname=$TraceUser.lasname
$this.DisplayName=“$($TraceUser.First Name')$($TraceUser.nam姓氏)”
$this.Company=$TraceUser'Payroll Company'
$this.PayrollNo=$TraceUser'PayrollNo'
$this.Email=$TraceUser'E-Mail'
$this.StartDate=[datetime]::ParseExact($($TraceUser.'Start Date')23:59“,'dd/MM/yyyy HH:MM',$null)
$this.LeaveDate=[datetime]::ParseExact($($TraceUser.'Leaving Date')23:59“,'dd/MM/yyyyy HH:MM',$null)
}
}
其中,如果我用AD用户作为参数实例化一个对象,它将使用第一个构造函数,但如果我用数组实例化,它将使用第二个构造函数

这似乎不起作用,通过在线搜索我所能找到的就是如何使用不同数量的参数来过载。与基于类型的重载无关

这可能吗

编辑:为了提供更多的上下文,下面正确地猜测了我的错误。我看到:

Cannot find an overload for "new" and the argument count: "1".
传递给第一个构造函数的$ADUser是通过运行Get ADUser获得的。传递给第二个构造函数的$TraceUser来自导入CSV

当我实例化User类的对象时,我将使用Get ADUser中的AD用户调用它,在这种情况下,我希望运行第一个构造函数,或者使用Import CSV中的System.Array调用它,在这种情况下,我希望运行第二个构造函数

我实际上是在ForEach循环中实例化这些,但我认为这与这里无关。下面是我如何创建这些的示例:

$oneADUser      = Get-ADUser -Filter * -SearchBase $OU
$oneTraceUser   = Import-CSV somefile.csv
$NewADUsers     = @()
$NewTraceUsers  = @()
$NewADUsers    += [User]::new($oneADUser)    # This should use the first constructor
$NewTraceUsers += [User]::new($oneTraceUser) # This should use the second constructor

我这样做对吗?

我想你可能会遇到的错误是

这是因为它将传递的数组视为参数数组

New-Object User -ArgumentList (Get-ADUser -Filter * | select -First 3)
此操作将失败,并显示消息

在它前面放一个
,如何绕过它

New-Object User -ArgumentList (,(Get-ADUser -Filter * | select -First 3))
您还可以使用
::New()


好吧,我知道了。谢谢大家的帮助

为了使其正常工作,我必须在将$oneTraceUser传递给构造函数之前将其强制转换为System.Array。最终工作代码如下所示:

class User {
    [string]$GivenName
    [string]$Surname
    [string]$DisplayName
    [string]$Company
    [string]$PayrollNo
    [string]$Email
    [DateTime]$StartDate
    [DateTime]$LeaveDate

    User([Microsoft.ActiveDirectory.Management.ADAccount]$ADUser) {
        $this.GivenName   = $ADUser.GivenName
        $this.Surname     = $ADUser.Surname
        $this.DisplayName = $ADUser.Name
        $this.PayrollNo   = $ADUser.EmployeeID
        $this.Email       = $ADUser.EmailAddress
        #$this.LeaveDate  = $ADUser.AccountExpires
    }

    User([System.Array]$TraceUser) {
        $this.GivenName   = $TraceUser.'First Name'
        $this.Surname     = $TraceUser.Surname
        $this.DisplayName = "$($TraceUser.'First Name') $($TraceUser.Surname)"
        $this.Company     = $TraceUser.'Payroll Company'
        $this.PayrollNo   = $TraceUser.'Payroll No'
        $this.Email       = $TraceUser.'E-Mail'
        $this.StartDate   = [datetime]::ParseExact("$($TraceUser.'Start Date') 23:59",'dd/MM/yyyy HH:mm',$null)
        $this.LeaveDate   = [datetime]::ParseExact("$($TraceUser.'Leaving Date') 23:59",'dd/MM/yyyy HH:mm',$null)
    }
}

$NewADUsers = New-Object -TypeName "System.Collections.ArrayList"
$NewTraceUsers = New-Object -TypeName "System.Collections.ArrayList"
$TraceData = Import-CSV $TraceCSV
$ADUsers = Get-ADUser -Filter * -SearchBase $OU -Properties EmployeeID
$TraceUsers = $TraceData | Where-Object 'Payroll Company' -eq $OU.DestinationIndicator
forEach($oneADUser in $ADUsers) {
    $NewADUser = [User]::new($oneADUser)
    forEach($oneTraceUser in $TraceUsers) {
        $NewTraceUser = [User]::new([System.Array]$oneTraceUser)
        $Result = Compare-Users $NewADUser $NewTraceUser
        Write-Output $Result
    }
}

我现在有一个用户类,根据传递给它的变量类型,它将运行从AD或CSV文件导入数据的两个类似构造函数中的一个,并且可以继续使用该类在一般用户之间进行比较。

它应该可以工作(尽管
System.Array
可能不是参数类型的最佳选择,但您使用它的方式不同):)请提供更多有关它如何工作的信息-构造函数是否引发异常?它总是选择一个而不是另一个吗?因此,经过进一步的研究,我发现为了使它起作用,构造函数(以及传递给它们的值)需要是强类型的。我现在已经将第二个构造函数更改为[PSCustomObject]$TraceUser,它现在可以工作了。我没有得到任何错误,但你瞧,现在它每次都被使用!我的广告构造器从未被使用过,即使我将ADAccount传递给它。谢谢你的回复!我在原来的帖子中添加了更多的细节。我是否应该以某种方式修改我的实例化,以允许将字符串数组传递给第二个构造函数?
New-Object User -ArgumentList (,(Get-ADUser -Filter * | select -First 3))
[User]::new((Get-ADUser -Filter * | select -First 3))
class User {
    [string]$GivenName
    [string]$Surname
    [string]$DisplayName
    [string]$Company
    [string]$PayrollNo
    [string]$Email
    [DateTime]$StartDate
    [DateTime]$LeaveDate

    User([Microsoft.ActiveDirectory.Management.ADAccount]$ADUser) {
        $this.GivenName   = $ADUser.GivenName
        $this.Surname     = $ADUser.Surname
        $this.DisplayName = $ADUser.Name
        $this.PayrollNo   = $ADUser.EmployeeID
        $this.Email       = $ADUser.EmailAddress
        #$this.LeaveDate  = $ADUser.AccountExpires
    }

    User([System.Array]$TraceUser) {
        $this.GivenName   = $TraceUser.'First Name'
        $this.Surname     = $TraceUser.Surname
        $this.DisplayName = "$($TraceUser.'First Name') $($TraceUser.Surname)"
        $this.Company     = $TraceUser.'Payroll Company'
        $this.PayrollNo   = $TraceUser.'Payroll No'
        $this.Email       = $TraceUser.'E-Mail'
        $this.StartDate   = [datetime]::ParseExact("$($TraceUser.'Start Date') 23:59",'dd/MM/yyyy HH:mm',$null)
        $this.LeaveDate   = [datetime]::ParseExact("$($TraceUser.'Leaving Date') 23:59",'dd/MM/yyyy HH:mm',$null)
    }
}

$NewADUsers = New-Object -TypeName "System.Collections.ArrayList"
$NewTraceUsers = New-Object -TypeName "System.Collections.ArrayList"
$TraceData = Import-CSV $TraceCSV
$ADUsers = Get-ADUser -Filter * -SearchBase $OU -Properties EmployeeID
$TraceUsers = $TraceData | Where-Object 'Payroll Company' -eq $OU.DestinationIndicator
forEach($oneADUser in $ADUsers) {
    $NewADUser = [User]::new($oneADUser)
    forEach($oneTraceUser in $TraceUsers) {
        $NewTraceUser = [User]::new([System.Array]$oneTraceUser)
        $Result = Compare-Users $NewADUser $NewTraceUser
        Write-Output $Result
    }
}