Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建在Windows主机上运行Powershell脚本的GitHub操作_Windows_Powershell_Github Actions - Fatal编程技术网

创建在Windows主机上运行Powershell脚本的GitHub操作

创建在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

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.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通常允许您在所有受支持的平台上互换使用
      \
      /
      作为路径分隔符-此特定路径形式始终被解释为模块引用;换句话说:您不能使用此语法表单以这种方式调用脚本(请参见下文)

    • 这一令人惊讶的不一致性在本文中进行了讨论

有两种方法可以避免这种模糊性,它们适用于所有受支持的平台;以下原因导致PowerShell明确地将该路径视为文件系统脚本路径:

  • 使用
    /
    代替
    \
    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