Терминал кода VS не может найти AWS SAM, хотя терминал Windows может

Я установил AWS SAM из установщика msi от AWS для Windows. после запуска установщика я запустил sam --version в cmd и powershell.

PS C:\Users\dgupta> sam --version
SAM CLI, version 1.26.0

Он возвращает только что установленную мной версию. Однако в коде VS я открыл терминал и запустил sam --version ошибки.

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6

sam : The term 'sam' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name,                                                                                                               g of the name,    
or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ sam --version
+ ~~~
    + CategoryInfo          : ObjectNotFound: (sam:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

почему это происходит ? разве терминал VS Code и обычный терминал не имеют доступа к одним и тем же переменным среды?


person Dhruv    schedule 15.07.2021    source источник
comment
Я не уверен, что именно это исправило, я думаю, что это связано с докером. команда sam не может быть найдена. поэтому я удалил и переустановил докер. отредактировал путь для python.exe в переменной пути. переустановил SAM и вместо перезагрузки компьютера выключил его и запустил без обновлений Windows.   -  person Dhruv    schedule 19.07.2021


Ответы (1)


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

Если вы вызываете внешний исполняемый файл (sam) по только имени, ваша проблема должна заключаться в том, что каталог, в котором находится исполняемый файл resides не указан в $env:PATH переменной среды, определенной для текущего процесса.

Однако возможно, что каталог внешнего sam исполняемого файла не в $env:PATH и что sam является вспомогательной командой PowerShell с тем же именем, что знает истинное местоположение sam и вызывает его за кулисами. Например, можно определить псевдоним, например New-Alias sam 'C:\path\to\sam.exe', или функцию, например function sam { & C:\path\to\sam.exe $args }.

Из сеанса PowerShell, в котором найдено sam :

  • Чтобы определить, к какому типу команды относится имя sam в вашем сеансе, используйте следующее и проверьте значение столбца CommandType:
Get-Command sam
  • Если тип команды - Application, вы действительно имеете дело с внешним исполняемым файлом, и столбец Source сообщит его полный путь < / strong>, из которого можно определить путь к каталогу исполняемого файла (который можно определить напрямую с помощью Split-Path (Get-Command -Type Application sam).Path

    • You then need to diagnose why that directory isn't in $env:Path in the other session - see first section below.
  • Если тип команды не Application:

    • You need to determine where the auxiliary alias or function is defined and why your other session doesn't see it, which, if the problem is reproducible in new sessions, must be connected to what profile files (as reflected in the automatic $PROFILE variable) were loaded.

Определите причину отсутствия каталога в $env:PATH:

Возможные причины:

  • Вы только что установили исполняемый файл, а установщик изменил постоянное определение $env:PATH в реестре.

    • Любые запущенные процессы были запущены до этой модификации или даже после нее, но из такого процесса не видят модификацию.

    • Решение:

      • Запустите новый сеанс, что в вашем случае означает перезапуск кода Visual Studio, но обязательно запускайте его из меню «Пуск» / панели задач / проводника, поскольку они осведомлены об измененной среде. В случае сомнений выйдите из системы и снова войдите в сеанс Windows или перезагрузите компьютер.

      • Либо обновите $env:PATH из реестра во время сеанса - см. Ниже.

  • Что-то в вашем текущем сеансе PowerShell (возможно, случайно) удалило каталог sam из внутрипроцессной переменной $env:PATH.

    • Решение:

      • Refresh the in-process $env:PATH definition from the registry with the following command (note that any prior in-process modifications are then lost):
$env:PATH = [Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [Environment]::GetEnvironmentVariable('Path', 'User')

Если эти решения не помогают (постоянно), проблема должна быть связана с тем, какие файлы профиля загружаются в разные среды - см. Следующий раздел.


Определите, какие файлы профиля были загружены в сеанс:

файлы профиля в PowerShell (по умолчанию) загружаются (с использованием точек) при запуске сеанса и позволяют настраивать сеансы, что может включать такие вещи, как определения пользовательских псевдонимов, функции и даже $env:PATH внутрипроцессные добавления.

Существует несколько файлов профиля, все из которых загружаются (по умолчанию), если они есть, по двум независимым измерениям: все пользователи против текущего пользователя и все- хосты по сравнению с текущим хостом (хост - это среда хоста PowerShell, такая как обычное окно консоли или терминал в Visual Studio Code).

автоматическая $PROFILE переменная сообщает путь к файлу профиля текущего пользователя, текущего хоста, но на самом деле имеет обычно невидимые свойства, перечисляющие все пути (вы можете сделать их видимыми с помощью $PROFILE | select * - см. этот ответ).

Какие профили загружаются в сеанс для данного пользователя, определяется следующими факторами:

  • По сути, подавляется загрузка профиля полностью с помощью переключателя -NoProfile интерфейса командной строки.

  • Если не подавлено (по умолчанию, даже при вызовах -Command и -File):

    • Какую версию PowerShell вы используете: старая версия Windows PowerShell, входящая в состав Windows (последняя и последняя версия - 5.1), чей интерфейс командной строки - powershell.exe, vs . кроссплатформенный PowerShell (Core) < / em>, чей интерфейс командной строки - pwsh.exe, иметь отдельные профили.

    • Тип среды хоста, отраженный в автоматическая $Host переменная.

Чтобы увидеть, какая командная строка использовалась для вызова текущего сеанса, выполните следующее:

[Environment]::CommandLine

Примечание:

  • В интегрированной консоли PowerShell в Visual Studio Code вы всегда увидите -NoProfile среди параметров, но профили могут все равно загружаться во время запуска, в зависимости от настроек расширения PowerShell

Из вышесказанного следует, что разные среды хоста загружают разные наборы файлов профилей, а в интегрированной консоли PowerShell, предоставляемой расширением PowerShell Visual Studio Code, < em> разные файлы профиля действительно загружаются (если загрузка включена в настройках) - по сравнению с обычными окнами консоли [1]

Если вы хотите, чтобы ваши интегрированные консоли PowerShell загружали тот же профиль текущего пользователя, что и обычные окна консоли:

  • В настройках кода Visual Studio убедитесь, что параметр PowerShell: Enable Profile Loading включен.

  • В интегрированной консоли PowerShell запустите psedit $PROFILE, чтобы открыть профиль текущего пользователя для конкретного хоста для редактирования.

  • Добавьте следующий контент:

. ($PROFILE -replace '\.VSCode', '.PowerShell')

[1] Обратите внимание, что вы можете использовать PowerShell в терминале Visual Studio Code даже без расширения PowerShell, и такой сеанс действительно использует те же профили, что и обычные окна консоли. - см. этот ответ.

person mklement0    schedule 16.07.2021