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

PowerShell函数接收参数值为空问题求助

PowerShell函数调用参数全部为空的原因及解决方法

问题场景

编写了如下PowerShell脚本,调用自定义函数Get-SSH-Command时,所有参数值都接收为空:

function Get-SSH-Command {
    param (
        [string]$private_key_path,
        [string]$user,
        [string]$domain
    )
    Write-Output "Function called with parameters:"
    Write-Output "PPP: $private_key_path"
    Write-Output "User: $user"
    Write-Output "Domain: $domain"

    return "ssh " +
        "-i '$private_key_path' " +
        "-o StrictHostKeyChecking=no " +
        "-o UserKnownHostsFile=known_hosts " +
        "${user}@${domain}"
}

$env:PRIVATE_KEY_PATH = "C:\Users\MC\key_pair.pem"
$env:EC2_USER = "ubuntu"
$env:EC2_TEST_DOMAIN = "contoso.com"

Write-Output "1: $env:PRIVATE_KEY_PATH"
Write-Output "2: $env:EC2_USER"
Write-Output "3: $env:EC2_TEST_DOMAIN"

$ssh_cmd = Get-SSH-Command `
    -private_key_path=$env:PRIVATE_KEY_PATH `
    -user=$env:EC2_USER `
    -domain=$env:EC2_TEST_DOMAIN

Write-Output $ssh_cmd

执行后输出:

1: C:\Users\MC\key_pair.pem
2: ubuntu
3: contoso.com
Function called with parameters:
PPP:
User:
Domain:
ssh -i '' -o StrictHostKeyChecking=no -o UserKnownHostsFile=known_hosts @

问题原因

函数名Get-SSH-Command违反了PowerShell的命名规则:PowerShell中-是减法运算符,当你使用Get-SSH-Command作为函数名时,PowerShell会将其解析为表达式Get - SSH - Command(即对三个未定义的变量做减法运算),而非你定义的函数。这意味着你调用的根本不是自己写的函数,自然无法传递参数,导致所有参数值为空。

解决方法

修改函数名,避免用-作为名称分隔符,改用PowerShell推荐的驼峰命名法或下划线分隔:

修改后的完整脚本

# 使用驼峰式命名的函数
function Get-SshCommand {
    param (
        [string]$private_key_path,
        [string]$user,
        [string]$domain
    )
    Write-Output "Function called with parameters:"
    Write-Output "PPP: $private_key_path"
    Write-Output "User: $user"
    Write-Output "Domain: $domain"

    return "ssh " +
        "-i '$private_key_path' " +
        "-o StrictHostKeyChecking=no " +
        "-o UserKnownHostsFile=known_hosts " +
        "${user}@${domain}"
}

$env:PRIVATE_KEY_PATH = "C:\Users\MC\key_pair.pem"
$env:EC2_USER = "ubuntu"
$env:EC2_TEST_DOMAIN = "contoso.com"

Write-Output "1: $env:PRIVATE_KEY_PATH"
Write-Output "2: $env:EC2_USER"
Write-Output "3: $env:EC2_TEST_DOMAIN"

# 调用修改后的函数
$ssh_cmd = Get-SshCommand `
    -private_key_path=$env:PRIVATE_KEY_PATH `
    -user=$env:EC2_USER `
    -domain=$env:EC2_TEST_DOMAIN

Write-Output $ssh_cmd

修改后执行,参数会正常传递,输出结果符合预期。


内容的提问来源于stack exchange,提问作者Michael B. Currie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:12:47