在未找到Constructor错误的PowerShell 2上,New-Object失败

时间:2016-07-12 08:57:19

标签: powershell

我在PowerShell 5

上运行了以下脚本

$NetworkChange = New-Object System.Net.NetworkInformation.networkchange

Register-ObjectEvent -InputObject $NetworkChange -EventName NetworkAddressChanged -SourceIdentifier "NetworkChanged" -Action {

    Write-Host "network switched"
    $LanConnected=@(Get-WmiObject win32_networkadapter -filter "netconnectionstatus = 2" | Where-Object {$_.netconnectionid -like "*Local Area Connection*"})

    If($LanConnected){
        Get-WmiObject win32_networkadapter -filter "netconnectionstatus = 2" | Where-Object {$_.netconnectionid -like "*Wireless Network Connection*"} | ForEach-Object {$_.disable()}
    }

    Else {
        Get-WmiObject win32_networkadapter | Where-Object {$_.netconnectionid -like "*Wireless Network Connection*"} | ForEach-Object {$_.enable()}
    }

}

但是,PowerShell 2失败,并且出现与New-Object cmdlet相关的以下错误

New-Object : Constructor not found. Cannot find an appropriate constructor for type System.Net.NetworkInformation.networkchange.
At line:1 char:11
+ New-Object <<<<  System.Net.NetworkInformation.networkchange
    + CategoryInfo          : ObjectNotFound: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : CannotFindAppropriateCtor,Microsoft.PowerShell.Commands.NewObjectCommand

知道它失败的原因吗? PowerShell 2上的New-Object cmdlet是否有不同的语法?

注意:我们的产品仍然在PowerShell 2上,因此这种斗争。 提前致谢

史蒂夫

1 个答案:

答案 0 :(得分:0)

在PS5中使用此代码:

#include <string>
using String = std::string;

class Base {
protected:
    String value;
};

class Readonly : virtual Base {
public:
    const String& method() const {
        return value;
    }
    String& method() {
        return value;
    }
};

class Writeonly : virtual Base {
public:
    Writeonly& method(const String& value) {
        this->value = value;
        return *this;
    }
    Writeonly& method(String&& value) {
        this->value = std::move(value);
        return *this;
    }
};

class Unrestricted : public Readonly, public Writeonly {};

void usage() {
    String string;
    Unrestricted unrestricted;
    unrestricted.method(string); // ambiguous
    string = unrestricted.method(); // ambiguous
}

PS2说$NetworkChange = [System.Net.NetworkInformation.NetworkChange]::new() 所以我们可以通过创建一个变量'经典'方式绕过它:

[System.Net.NetworkInformation.NetworkChange] doesn't contain a method named 'new'.