如何获取一个任务来设置一个可用于配置的变量?

7
在 VS Code 中,我定义了一个任务:
"tasks": [
    {
        "label": "getcredentials",
        "type": "shell",            
        "command": ".\\TestScripts\\GetCredentials.ps1"
    }
]

GetCredentials.ps1 创建一个凭据并将其分配给 $Global:credential。

在 launch.json 中,我想将 $Global:credential 用作我正在调试的实际脚本的参数:

    "configurations": [
        {
            "type": "PowerShell",
            "request": "launch",
            "name": "Exchange Parameter Set, No Inactive",
            "preLaunchTask": "getcredentials",
            "script": "${file}",
            "args": [ "-Credential $Global:credential"],
            "cwd": "${file}"
        }
]

然而,该脚本无法获取$Global:credential的值(它会提示输入凭据)。我认为这应该是可能的,因为此https://code.visualstudio.com/docs/editor/tasks-appendix说如果未指定环境变量,则使用父进程环境。
有什么想法吗?我漏掉了什么,还是这不可能?

1
我在使用Visual Studio方面经验很少。每个任务是否作为单独的进程启动?如果是这样,那么在任务之间传递变量是行不通的,因为你不能跨进程边界传递(PowerShell)变量。 - Ansgar Wiechers
@Ansgar Wiechers - 如果我们在GNU\Linux上使用BASH而不是在MS Windows上使用PowerShell,这个方法是否可行?我个人正在尝试前者,但似乎对我来说并没有起作用。 - Shawn Eary
1个回答

1

https://code.visualstudio.com/docs/editor/tasks-appendix提到了任务定义中可选的env键:

   /**
     * The environment of the executed program or shell. If omitted
     * the parent process' environment is used.
     */

这与环境变量有关,而不是PowerShell会话。
此外,所指的父进程环境是Visual Studio自己的一组环境变量。
换句话说:
由于PS任务会话在PS调试会话开始时已退出,因此您无法在两个会话之间传递变量。
即使尝试在PS任务会话中设置环境变量也行不通,因为两个会话都是以VS Code作为父进程运行的,不能看到彼此的环境修改。
您最好使用(临时)文件来从任务会话向调试会话传递值。

查看this answer了解如何将凭据保存到文件并从文件中恢复。
注意:仅适用于Windows

选择一个文件位置(在最简单的情况下,使用固定名称,例如$HOME/.test-creds.clixml),由任务会话写入,然后由调试会话读取,类似于:

"args": [ "-Credential (Import-CliXml $HOME/.test-creds.clixml)" ],

1
这个非常好用,谢谢mklement0!我没想到你可以在参数中运行代码。这比我之前尝试的要简单得多。 - yltlatl
@yltlatl:很高兴听到有所帮助,我很愉快。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接