创建在Windows主机上运行Powershell脚本的GitHub操作
My GitHub操作工作流“在”windows最新版本上运行”。我想要一个执行PowerShell(核心或遗留)脚本的自定义操作。我有一个在Linux和MacOS上运行的并行操作。因此,my.github/actions/install tf win目录包含以下action.yml创建在Windows主机上运行Powershell脚本的GitHub操作,windows,powershell,github-actions,Windows,Powershell,Github Actions,My GitHub操作工作流“在”windows最新版本上运行”。我想要一个执行PowerShell(核心或遗留)脚本的自定义操作。我有一个在Linux和MacOS上运行的并行操作。因此,my.github/actions/install tf win目录包含以下action.yml name:install\u tf\u win 描述:安装Terraform/TerraGrunt for Windows 跑: 使用:“复合” 步骤: -运行:安装tf-win\install-tf-win.ps
name:install\u tf\u win
描述:安装Terraform/TerraGrunt for Windows
跑:
使用:“复合”
步骤:
-运行:安装tf-win\install-tf-win.ps1
外壳:pwsh
该目录还包含install-tf-win.ps1。我已经尝试了各种各样的关于run语句的变体。以“&”开头,不带“&”,使用向前和向后斜杠的路径变化。我最初是从$GITHUB_ACTION_PATH/install-tf-win.ps1(适用于Linux/MacOS)开始的,但是似乎GITHUB_ACTION_PATH被评估为空字符串,然后有人抱怨没有找到/install-tf-win.ps1。我尝试了pwsh和powershell来获取shell键值
上面显示的表单导致此错误:
Run ./.github/actions/install-tf-win
install-tf-win\install-tf-win.ps1: D:\a\_temp\c1d3d7fa-074b-4f90-ade0-799dcebd84ec.ps1:2
Line |
2 | install-tf-win\install-tf-win.ps1
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The module 'install-tf-win' could not be loaded. For more information, run 'Import-Module
| install-tf-win'.
显然,我可以通过将PowerShell语句放在一个步骤中来编写代码。但是,文件表明这应该是可行的
那么,我如何才能让它工作呢?错误消息意味着您无法使用相对路径引用脚本: 该命令通过其
-command
(-c
)参数传递到PowerShell[Core]的pwsh
,该参数解释的
安装tf win
部分
install tf-win\install tf-win.ps1
作为模块名,而不是作为子目录,因为在Windows[1]上没有该名称对应的实际子目录,因此这意味着这样的路径不存在
建议您需要一个基于GITHUB\u ACTION\u path
环境变量的绝对路径,该变量在PowerShell中必须被引用为$env:GITHUB\u ACTION\u path
(未测试):
注:
- 需要使用
和
,这是语法上的必要性,因为脚本路径包含(n环境)变量引用;如果路径被引用,同样适用-请参阅以获取背景信息
- 由于
在YAML中是一个元字符,在值的开头使用时不带引号,因此整个字符串都带引号。在本例中使用单引号(&
),这样YAML就不会预先解释字符串的内容“…”
- 顺便说一句:“
”引用工作(经Kevin,OP确认)的含义是,当在Windows上最终调用”…“
时,字符串的内容(正确地)是双引号(pwsh-c
),因为PowerShell的CLI只识别“…”
具有用于命令行参数分析的语法功能。相比之下,“
-引用的“…”
参数将被解释为逐字逐句字符串,而不是命令,从而导致其内容被简单地回显-c
- 顺便说一句:“
[1]从PowerShell 7.1开始,PowerShell作为命令执行时如何解释路径,如
foo\bar.ps1
被解释为命令-在PowerShell会话内,并通过PowerShell的//-c
参数执行,foo\bar.ps1格式不明确
:
- 它可以引用名为
的模块及其foo
命令(即使模块命令没有bar.ps1
名称扩展名).ps1
- 它可以引用其中的子目录
和文件foo
bar.ps1
- 这仅适用于Windows:
- PowerShell首先将该路径解释为文件系统路径
- 如果路径不存在,它将返回到将其解释为模块命令引用
- 在类Unix平台上-尽管PowerShell通常允许您在所有受支持的平台上互换使用
和\
作为路径分隔符-此特定路径形式始终被解释为模块引用;换句话说:您不能使用此语法表单以这种方式调用脚本(请参见下文)/
- 这一令人惊讶的不一致性在本文中进行了讨论
- 这仅适用于Windows:
- 使用
代替/
:\
foo/bar.ps1
- 在路径前面加上
(或\
):/
\foo\bar.ps1
请注意,当使用PowerShell的
-File
参数(而不是-Command
/-c
)时,不会出现这种歧义,因为即使在类似Unix的平台上,参数始终被视为(可能相对的)文件系统路径,无论您是使用\
还是/
表单-run:&$env:GITHUB\u ACTION\u PATH/install tf win/install tf win.ps1,shell:pwsh工作正常。重要的是要注意,Linux或MacOS的等效程序不需要额外的路径段“/install tf win/”。
# ...
- run: '& $env:GITHUB_ACTION_PATH/install-tf-win/install-tf-win.ps1'
shell: pwsh