如何将GitHub Secrets作为参数传递给PowerShell脚本?
问题原因
GitHub Actions会自动对Secrets内容进行脱敏替换,当你在run命令里直接通过YAML语法展开${{ env.username }}和${{ env.password }}时,这些Secrets值会被替换成***,而PowerShell会把这个***当成要执行的命令,因此抛出“***未被识别为cmdlet、函数、脚本文件或可执行程序”的错误。同时直接将Secrets作为脚本参数传递,还可能遇到特殊字符、空格导致的参数解析问题。
解决方案
方案1:让PowerShell脚本直接读取环境变量(推荐)
这种方式更安全,也能避免参数解析的各类问题。
修改GitHub Actions YAML配置
- name: Connecting to shared drive env: TEST_USERNAME: ${{ secrets.TEST_USERNAME }} TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }} run: | & "${{ github.workspace }}\Connect-Drive.ps1"
修改PowerShell脚本(Connect-Drive.ps1)
在脚本内部通过$env:前缀读取环境变量:
# Connect-Drive.ps1 $username = $env:TEST_USERNAME $password = $env:TEST_PASSWORD # 示例:将密码转为安全字符串并创建凭据 $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $securePassword) # 执行共享驱动器连接操作 New-PSDrive -Name Z -PSProvider FileSystem -Root "\\server\share" -Credential $credential
方案2:通过PowerShell传递环境变量作为参数(若必须用参数接收)
如果脚本依赖参数输入,可以在run命令里通过PowerShell语法引用环境变量,而非直接在YAML中展开:
- name: Connecting to shared drive env: TEST_USERNAME: ${{ secrets.TEST_USERNAME }} TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }} run: | & "${{ github.workspace }}\Connect-Drive.ps1" -Username $env:TEST_USERNAME -Password $env:TEST_PASSWORD
对应的脚本需要定义参数:
# Connect-Drive.ps1 param( [Parameter(Mandatory=$true)] [string]$Username, [Parameter(Mandatory=$true)] [string]$Password ) # 后续使用参数执行操作 $securePassword = ConvertTo-SecureString $Password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($Username, $securePassword) # ... 其他共享驱动器连接逻辑
注意事项
- 禁止在脚本或日志中输出Secrets内容,即使GitHub会自动脱敏,也要避免明文暴露风险。
- 始终使用
ConvertTo-SecureString将明文密码转为安全字符串,减少内存中的明文暴露时长。
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

