Сохраняйте переменную $ для Powershell в фрагменте кода VS - PullRequest
2 голосов
/ 23 февраля 2020

Я могу сохранить свои фрагменты кода с интервалом между вкладками в коде VS для Powershell, но он продолжает игнорировать мои переменные, не отображая $ для моих переменных при вызове фрагмента. Он просто вставит имя и пропустит $.

Как получить код VS для вставки в $ при выборе фрагмента кода?

Вот файл VS Code JSON, который я использую для своего «шаблона» фрагмент

{
    // Place your snippets for powershell here. Each snippet is defined under a snippet name and has a prefix, body and 
    // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
    // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
    // same ids are connected.
    // Example:
    // "Print to console": {
    //  "prefix": "log",
    //  "body": [
    //      "console.log('$1');",
    //      "$2"
    //  ],
    //  "description": "Log output to console"
    // }

"Template": {
    "prefix": "template",
    "body": [
        "<#",
        ".SYNOPSIS",
        "\t<Overview of script>",
        "",
        ".SYNTAX",
        "\t<Cmdlet-Name> -Parameter <value>",
        "",
        ".DESCRIPTION",
        "\t<Brief description of script>",
        "",
        ".PARAMETER <Parameter_Name>",
        "\t<Brief description of parameter input required. Repeat this attribute if required>",
        "",
        ".INPUTS",
        "\t<Inputs if any, otherwise state None>",
        "",
        ".OUTPUTS",
        "\t<Outputs if any, otherwise state None - example: Log file stored in C:\file.log>",
        "", 
        ".EXAMPLE",
        "\t<Example goes here. Repeat this attribute for more than one example>",
        "",
        ".REMARKS",
        "\tVersion:        1.0",
        "#>",
        "",
        "#---------------------------------------------------------[Variables]------------------------------------------------------------",
        "",
        "$var1 = <stuff>",
        "$var2 = <stuff>",
        "",
        "#---------------------------------------------------------[Import Modules]--------------------------------------------------------",
        "",
        "Import-Module <name>",
        "",
        "#-----------------------------------------------------------[Functions]------------------------------------------------------------",
        "",
        "Function <FunctionName> {",
        "\t[CmdletBindinging()]",
        "\tparam(",
        "\t\t[Parameter()]",
        "\t\t[string]$MyOptionalParameter,",
        "",
        "\t\t[Parameter(Mandatory)]",
        "\t\t[int]$MyMandatoryParameter",
        "\t)",
        "",   
        "\tTry{",
        "\t\t<code goes here>",
        "\t}",
        "", 
        "\tCatch {",
        "\t\tWrite-Host $Error.Exception",
        "\t\t$Error.Exception | Out-File Out-File $env:TEMP\file.log",
        "\t\tBreak",
        "\t}",
        "",
        "\tFinally {",
        "\t\t$time = Get-Date",
        "\t\tcompleted at $time | Out-File $env:TEMP\file.log",
        "\t}",
        "}",
        "",
        "#-----------------------------------------------------------[Execution]------------------------------------------------------------",
        "",
        "<FunctionName>",
    ],
    "description": "test"
}

}

Когда я вызываю этот фрагмент, чтобы вставить шаблон в новый файл .ps1, он пропускает все символы $. Как вы получаете те, чтобы остаться?

1 Ответ

2 голосов
/ 26 февраля 2020

Используйте \\$ внутри тела фрагмента кода Visual Studio для встраивания литерала $.

Например, для встраивания переменной PowerShell $HOME , используйте \\$HOME.

Примечание. С точки зрения синтаксического анализатора, для экранирования требуется single \, но фрагменты определяются как JavaScript strings , которые сами используют \ в качестве escape-символа, \\ необходим для передачи одного \ через синтаксический анализатор.

См. документы .


В качестве отступления:

Использование $$ случайно, несколько работает, но его цель не в том, чтобы убежать, и это приводит к другому поведение :

расположение идентификатора с префиксом $$ становится tab-stop , поскольку код Visual Studio интерпретирует последовательность следующим образом:

первый $ становится литералом [1] , но второй $ и следующий за ним идентификатор интерпретируются как Код Visual Studio ссылка на переменную; если встроенная переменная с таким именем не существует, она используется как заполнитель текст.


[1] Любая $ не , за которым следует допустимое имя местозаполнителя кода Visual Studio или ссылка на переменную обрабатывается буквально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...