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
相关产品推荐
相关产品推荐

