Windows启动时PowerShell脚本报错:找不到接受参数'4'的位置参数
我在配置Windows启动时运行PowerShell脚本,反复出现如下错误:
2023/06/07 16:32:45 GCEMetadataScripts: 启动启动脚本(版本20230403.00)。
2023/06/07 16:32:45 GCEMetadataScripts: 在元数据中找到windows-startup-script-ps1。
2023/06/07 16:35:05 GCEMetadataScripts: windows-startup-script-ps1: Set-NetIPAddress : 找不到接受参数'4'的位置参数。
2023/06/07 16:35:05 GCEMetadataScripts: windows-startup-script-ps1: 在 C:\Windows\TEMP\metadata-scripts3738309189\windows-startup-script-ps1.ps1:8 字符:1
2023/06/07 16:35:05 GCEMetadataScripts: windows-startup-script-ps1: + Set-NetIPAddress -InterfaceIndex (Get-NetAdapter).InterfaceIndex �?"I ...
2023/06/07 16:35:05 GCEMetadataScripts: windows-startup-script-ps1: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2023/06/07 16:35:05 GCEMetadataScripts: windows-startup-script-ps1: + CategoryInfo : InvalidArgument: (:) [Set-NetIPAddress], ParameterBindingException
2023/06/07 16:35:05 GCEMetadataScripts: windows-startup-script-ps1: + FullyQualifiedErrorId : PositionalParameterNotFound,Set-NetIPAddress
2023/06/07 16:35:05 GCEMetadataScripts: windows-startup-script-ps1 退出状态0
2023/06/07 16:35:05 GCEMetadataScripts: 启动脚本运行完成。
这个脚本在PowerShell ISE里运行完全正常,但启动时就报错,我是PowerShell新手,求帮忙解决。附上脚本内容:
#-------Wait 5 minutes before startup script begins Start-Sleep -s 300 #-------Get Network Interface Index and Remove Existing DHCP IP Address from Interface Set-NetIPInterface -InterfaceIndex (Get-NetAdapter).InterfaceIndex -Dhcp Disabled #-------Remove Add New Static IP Address Set-NetIPAddress -InterfaceIndex (Get-NetAdapter).InterfaceIndex –IPAddress "x.x.x.x" -DefaultGateway "x.x.x.x" -PrefixLength "x" #-------Set DNS Server Addresses to GCP Domain Controllers Set-DNSClientServerAddress –InterfaceIndex (Get-NetAdapter).InterfaceIndex –ServerAddresses ("x.x.x.x","x.x.x.x") #-------Set DNS Connection Suffix to etmcorad.com Set-DnsClient –InterfaceIndex (Get-NetAdapter).InterfaceIndex -ConnectionSpecificSuffix "etmcorad.com"
问题原因与解决方案
1. 特殊短横线是核心问题
你脚本中–IPAddress、–InterfaceIndex、–ServerAddresses前的短横线并非PowerShell识别的标准英文短横线(-),而是En Dash(长一点的特殊短横线)。PowerShell无法将这种字符识别为参数前缀,会把后面的参数值当成位置参数,从而引发找不到接受参数'4'的错误。
2. 额外优化点
(Get-NetAdapter).InterfaceIndex可能返回多个网卡的索引,直接使用会导致命令执行混乱,建议指定具体网卡名称(比如Get-NetAdapter -Name "以太网"),或者过滤出活跃网卡。PrefixLength需要是数字类型,不要加引号,比如-PrefixLength 24而非"x"。
修正后的脚本
#-------启动前等待5分钟 Start-Sleep -Seconds 300 #-------获取目标网卡的接口索引(根据实际网卡名称修改) $targetAdapter = Get-NetAdapter -Name "以太网" $interfaceIndex = $targetAdapter.InterfaceIndex #-------禁用DHCP Set-NetIPInterface -InterfaceIndex $interfaceIndex -Dhcp Disabled #-------设置静态IP地址 Set-NetIPAddress -InterfaceIndex $interfaceIndex -IPAddress "x.x.x.x" -DefaultGateway "x.x.x.x" -PrefixLength 24 # 替换为实际前缀长度 #-------设置DNS服务器地址 Set-DnsClientServerAddress -InterfaceIndex $interfaceIndex -ServerAddresses ("x.x.x.x","x.x.x.x") #-------设置DNS连接后缀 Set-DnsClient -InterfaceIndex $interfaceIndex -ConnectionSpecificSuffix "etmcorad.com"
验证步骤
- 替换所有特殊短横线为标准英文短横线(
-)。 - 测试时可缩短等待时间(比如
-Seconds 10),快速验证效果。 - 通过Windows任务计划创建启动任务测试脚本,避免仅在ISE中验证。
内容的提问来源于stack exchange,提问作者Scott E.

