You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量修改静态IP网卡子网掩码脚本执行无报错但未生效求助

批量修改静态IP网卡子网掩码脚本执行无报错但未生效求助

嘿,我来帮你排查下脚本里的问题,主要有几个关键点导致你看不到修改效果:

  1. 远程会话变量未传回本地
    你用Invoke-Command在远程机器上获取了$NetAdapters,但这个变量只存在于远程的PSSession里,本地会话根本拿不到它的值。所以后面的foreach ($NetAdapter in $NetAdapters)循环其实根本没执行——因为本地的$NetAdapters是空的,自然不会做任何修改操作,这也是脚本没报错但没效果的核心原因。

  2. 未过滤静态IP的网卡
    你的需求是只修改静态IPv4地址的网卡,但原脚本里只过滤了非Wi-Fi的物理网卡,没有判断IP地址是静态还是DHCP分配的,这样会误操作到DHCP的网卡(不过因为第一个问题,这步还没执行)。

  3. Set-NetIPAddress参数冲突
    你同时使用了-PrefixLength 16和-SubnetMask $SubnetMask,这两个参数是互斥的——用其中一个就够了,同时用可能会导致命令异常(不过因为前面的循环没执行,所以没报错)。

修正后的脚本

#Defining Variables
$Computers = Get-Content "C:\computers.txt"
$SubnetMask = "255.255.0.0"
$VerbosePreference = "Continue"

#Loop Through Hostnames
foreach ($Computer in $Computers) {
    try {
        #Creating a PSSession
        $PSSession = New-PSSession -ComputerName $Computer -ErrorAction Stop
        
        # 在远程会话内完成所有操作:获取符合条件的网卡 + 修改子网掩码
        Invoke-Command -Session $PSSession -ScriptBlock {
            param($SubnetMask)
            # 筛选:物理网卡、非Wi-Fi、IPv4静态地址的网卡
            $StaticNetAdapters = Get-NetAdapter -Physical | 
                Where-Object {$_.InterfaceAlias -ne "Wi-Fi"} |
                Get-NetIPConfiguration |
                Where-Object {
                    $_.IPv4Address.PrefixOrigin -eq "Manual" -and 
                    $_.IPv4Address.AddressFamily -eq "IPv4"
                }

            foreach ($adapter in $StaticNetAdapters) {
                Write-Verbose "正在修改计算机 $($env:COMPUTERNAME) 上网卡 $($adapter.InterfaceAlias) 的子网掩码"
                # 使用SubnetMask参数修改,或者用-PrefixLength 16二选一即可
                Set-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex `
                                 -SubnetMask $SubnetMask `
                                 -PrefixOrigin Manual `
                                 -ErrorAction Stop
            }
        } -ArgumentList $SubnetMask

        Write-Verbose "计算机 $Computer 的子网掩码修改完成"
    }
    catch {
        Write-Error "处理计算机 $Computer 时出错:$_"
    }
    finally {
        # 确保会话被关闭,即使出错
        if ($PSSession) {
            Remove-PSSession -Session $PSSession
        }
    }
}

关键修改说明

  • 把所有操作放到远程会话内执行:这样就不用在本地和远程之间传递变量,直接在目标机器上完成筛选和修改,避免了变量作用域的问题。
  • 增加静态IP筛选条件:通过Get-NetIPConfiguration获取IP配置,判断IPv4Address.PrefixOrigin -eq "Manual"来确认是静态IP的网卡,完全符合你的需求。
  • 移除冲突参数:只保留-SubnetMask参数(或者你也可以换成-PrefixLength 16,效果完全一致),避免参数互斥导致的异常。
  • 增加错误处理:用try/catch/finally确保即使出错也能关闭PSSession,同时捕获错误信息方便后续排查问题。
  • 使用InterfaceIndex代替InterfaceAlias:相比网卡别名,接口索引在远程机器上更可靠,能避免别名重复或不一致的问题。

备注:内容来源于stack exchange,提问作者Mastaxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:09:08