Как проверить условный синтаксис powershell? - PullRequest
1 голос
/ 23 октября 2019

Есть ли в PowerShell средство проверки синтаксиса для условий? Этот код пропустит условное

if ($templList -ne $null -and $templList.items.Length > 0) {
  $templID=$templList.items[0].id
  write-host $templList.items
}

, поскольку «-gt» заменяется на «>».

1 Ответ

3 голосов
/ 23 октября 2019

Строго говоря, вы ищете средство проверки семантики , учитывая, что ваш код синтаксически правильный .

Проблема в том, что, хотя код былформально правильно, он не делает то, что вы намеревались сделать.

PSScriptAnalyzer (PSSA) является линтером дляPowerShell , и он интегрирован в расширение PowerShell для Код Visual Studio .

. Он может решить вашу проблему, выдав следующее сообщение:

Вы имели в виду использование оператора перенаправления '>'?
Операторы сравнения в PowerShell: '-gt' (больше чем) или '-ge' (больше или равно).


Использование в Visual Studio Код:

  • Установить расширение PowerShell .

  • Один разПосле установки сценария, открытого для редактирования, вы увидите подчеркнутую часть > 0, а при наведении на нее сообщение будет отображаться как всплывающая подсказка.

  • Вы можете просмотреть все сообщения для текущего файла в представлении «Проблемы» ( Ctrl-Shift-M или, через меню, View > Problems), которое случайно, покажет вам, что PSSA обнаружил дополнительные потенциальные проблемы с вашим фрагментом кода.

  • Чтобы настроить, какие правила применять (о каких потенциальных проблемах следует предупреждать), используйте >PowerShell: Select PSScriptAnalyzer Rules из палитры команд,

    • Названия правил, такие как PSAvoidGlobalVars, в основном не требуют пояснений; документация по правилам описывает их (без префикса PS);а также тема лучших практик .

    • Важно :

      • После проверки / снятия отметки(или нажав Введите вкл.) по интересующим правилам, обязательно нажмите Введите в пункте меню Confirm вверху, иначе ваши изменения не вступят в силу.

      • Начиная с v2019.11.0, эти варианты не сохраняются (запоминаются только в текущем сеансе) - см. эту проблему GitHub

Обратите внимание, что PSSA также предлагает автоматическое (пере) форматирование кода PowerShell ( Alt-Shift-F или, через палитру команд, >Format Document).


Автономное использование:

  • Установка *Модуль 1109 * из галереи PowerShell;Например:

    • Install-Module -Scope CurrentUser PSScriptAnalyzer

    • Модуль поставляется со следующими командлетами:

      • Invoke-ScriptAnalyzer ... lints файлы сценариев.
      • Invoke-Formatter ... переформатирует код, переданный в виде строки .
      • Get-ScriptAnalyzerRule ... перечисляет стандартные и необязательные пользовательские правила анализатора.
  • Передайте путь вашего сценария в командлет Invoke-ScriptAnalyzerчтобы выполнить linting.

С вашим кодом вы увидите следующий вывод (получив сценарий с именем pg.ps1):


RuleName                            Severity     ScriptName Line  Message
--------                            --------     ---------- ----  -------
PSPossibleIncorrectUsageOfRedirecti Warning      pg.ps1     1     Did you mean to use the redirection operator '>'? The
onOperator                                                        comparison operators in PowerShell are '-gt' (greater than)
                                                                  or '-ge' (greater or equal).
PSPossibleIncorrectComparisonWithNu Warning      pg.ps1     1     $null should be on the left side of equality comparisons.
ll
PSUseDeclaredVarsMoreThanAssignment Warning      pg.ps1     2     The variable 'templID' is assigned but never used.
s
PSAvoidUsingWriteHost               Warning      pg.ps1     3     File 'pg.ps1' uses Write-Host. Avoid using Write-Host
                                                                  because it might not work in all hosts, does not work when
                                                                  there is no host, and (prior to PS 5.0) cannot be
                                                                  suppressed, captured, or redirected. Instead, use
                                                                  Write-Output, Write-Verbose, or Write-Information.
...