Исключение не найдено при выполнении скриптов amazon powershell через packer.

При попытке запустить командлет из установленного на компьютере модуля PowerShell может появится ошибка:

The command XXX was found in the module, but the module YYY could not be loaded.

В моем случае эта ошибка появилась при попытке подключиться к тенанту Microsoft 365 с помощью модуля Exchange Online PowerShell.

Connect-ExchangeOnline : The Connect-ExchangeOnline command was found in the module ExchangeOnlineManagement, but the module could not be loaded. For more information, run Import-Module ExchangeOnlineManagement.

  • CategoryInfo : ObjectNotFound: (Connect-ExchangeOnline:String) [], CommandNotFoundException
  • FullyQualifiedErrorId : CouldNotAutoloadMatchingModule

Ошибка при загрузке команды из PowerShell модуля в сессию

Чаще всего эта ошибка означает, что у вас на компьютере запуск сторонних модулей ограничивается настройками PowerShell Execution Policy.

В данном случае политика Restricted запрещает запуск сторонних скриптов.

Get-ExecutionPolicy

Разрешение ограничения запуска скриптов

Попробуйте загрузить модуль командой:

Import-Module ExchangeOnlineManagement

Должна появится ошибка:

Import-Module: File C:\Program Files\WindowsPowerShell\Modules\ExchangeOnlineManagement\3.3.0\netFramework\ExchangeOnlineManagement.psm1 cannot be loaded because running scripts is disabled on this system.

Запуск PowerShell скриптов ограничен на этом компьютере

Можно разрешить запускать команды из внешних PowerShell модулей только в текущей сессии:

Set-ExecutionPolicy RemoteSigned -scope Process

Или можно разрешить запуск любых локальных скриптов для текущего пользователя.

Если при попытке импортировать модуль появится ошибка вида:

Import-Module : Could not load file or assemblyor one of its dependencies. The system cannot find the file specified.

В этом случае скорее всего модуль загружен не полностью или поврежден. Удалите каталог с модулем с диска и переустановите модуль. PowerShell модули устанавливаются в одну из следующих директорий:

  • C:\Users\YourUserName\Documents\WindowsPowerShell\Modules– в профиле текущего пользователя
  • C:\Program Files\WindowsPowerShell\Modules– обычно сюда устанавливаются сторонние модули, доступные для всех пользователей
  • C:\Windows\system32\WindowsPowerShell\v1.0\Modules– встроенные в Windows модули

Еще один вариант ошибки импорта модуля:

import-module : File …\…\modulename.psm1 cannot be loaded. The file …\…\modulename.psm1 is not digitally signed. You cannot run this script on the current system

Кроме исправления настроек политики запуска PowerShell скриптов причина такой ошибки может быть в том, что указанный файл модуля был вручную скачан с Интернета. В этом случае нужно просто разблокировать скачанный файл командой.

При попытке создания AMI с использованием Packer возникает ошибка – CommandNotFoundException.

:/>  Что делать, если не открываются «Устройства и принтеры» на Windows 7

Написана строка ниже в packer –

build { sources = [source.amazon-ebs.windows-2019] provisioner powershell { inline = [ C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1 -Schedule, C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\SysprepInstance.ps1 -NoShutdown ] }
}

Журналы консоли Packer –

==> amazon-ebs.windows-2019: Провиженинг с помощью Powershell...
==> amazon-ebs.windows-2019: Провиженинг с помощью сценария Powershell: C:\Users\UIF30855\AppData\Local\Temp\powershell-provisioner1857881635
==> amazon-ebs.windows-2019: C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 : Термин
==> amazon-ebs.windows-2019: C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 не является распознанным как именем командлета,
==> amazon-ebs.windows-2019: функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если путь был указан, убедитесь, что
==> amazon-ebs.windows-2019: путь верный, и попробуйте снова.
==> amazon-ebs.windows-2019: В C:\Windows\Temp\script-64993cb4-61c2-d83d-5dcf-d8a452c02387.ps1:1 символ:1
==> amazon-ebs.windows-2019: + C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.p ...
==> amazon-ebs.windows-2019: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
==> amazon-ebs.windows-2019: + CategoryInfo : ObjectNotFound: (C:\ProgramData\...izeInstance.ps1:String) [], CommandNotFoundException
==> amazon-ebs.windows-2019: + FullyQualifiedErrorId : CommandNotFoundException
==> amazon-ebs.windows-2019:

спрашивал 26 июня 2023 в 7:41

Аватар пользователя Learning Coding

Без проверки полного hcl файла я не могу быть уверен, что эти файлы отсутствуют в базовом образе. Однако, я рекомендую два способа проверить причину проблемы:

  • измените встроенные команды для списка содержимого C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts
provisioner powershell { inline = [ cd C:/ProgramData/Amazon/EC2-Windows/Launch/Scripts, ls ]
}
provisioner powershell { inline = [ cd C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts, ls ]
}
  • или просто замените двойные обратные слэши на наклонные черты
provisioner powershell { inline = [ C:/ProgramData/Amazon/EC2-Windows/Launch/Scripts/InitializeInstance.ps1 -Schedule, C:/ProgramData/Amazon/EC2-Windows/Launch/Scripts/SysprepInstance.ps1 -NoShutdown ]
}

Пример из официальной документации, другой пример

ответил 29 июня 2023 в 18:53

Аватар пользователя Marcin Słowikowski

Содержание

Unit testing важен для обеспечения качества кода. Этот принцип также применим к PowerShell с использованием Pester. Pester, универсальный фреймворк тестирования и мокирования для PowerShell, становится неотъемлемым инструментом в этом контексте. Однако, что делать, если вы столкнулись с CommandNotFoundException? В этом блог-посте мы исследуем этот конкретный сценарий и объясним его разрешение в ваших тестах Pester.

Понимание Mокирования в Pester

Для тех, кто не знаком с Pester и его возможностями мокирования, вот краткое введение в мокирование в Pester. Как указано в документации, Pester предлагает набор функций мокирования, которые упрощают процесс имитации зависимостей и проверки поведения. Эти функции позволяют вам эффективно зашимить уровни данных или мокировать сложные функции, которые уже имеют свои собственные тесты.

Mock Get-Content {This is a mocked example}

В этом примере, любой вызов Get-Content во время выполнения теста возвращает строку This is a mocked example.

:/>  Загрузка файла по ftp через консоль в одну команду |

Вызов и его решение

[CmdletBinding()]
param ( [Parameter()] [string] $UserEmail
)
Get-AzureADUser -ObjectId $UserEmail | Remove-AzureAdUser -Force

Для тестирования этого я создал краткий тест Pester:

Describe Azure script { Context When parameters are correct { It Should remove the Azure AD User { Mock Get-AzureADUser {} Mock Remove-AzureAdUser {} { .\Azure.ps1 -UserEmail ryan@go.euc} | Should -Not -Throw } }
}
[...Тестирование вывода...]

Заключение

Pester – мощный фреймворк, обеспечивающий всестороннее тестирование кода PowerShell, тем самым повышая общее качество. Знали ли вы, что вы также можете включить Pester в результаты вашего конвейера Azure DevOps? Дополнительные сведения можно найти здесь: Logit Blog – Увеличение успешности конвейеров Azure DevOps с помощью Pester

Если вы столкнулись с ошибкой CommandNotFoundException во время тестирования с Pester, это просто указывает на недоступность командлета. Вы можете исправить это, создав простую фиктивную функцию внутри теста или убедившись в доступности модуля.

## Решение проблемы с nodejs и powershell
Credit to Niels Reloe. Together, we resolved this issue and continued our journey toward achieving 100% code coverage!
---
Я пытаюсь с помощью **nodejs** и **powershell** найти количество видимых окон для процесса **FastExecuteScript.exe** и завершить этот процесс, в случае если таких окон больше одного.
Все действия записываются в лог-файл **1logggg.txt**
### Операционная система
- Windows 10
### Ошибка в лог файле
Скрипт запущен: 19.05.2024, 17:18:26
Проверка процессов FastExecuteScript.exe
Общее количество процессов FastExecuteScript.exe: 1
Используем команду для получения кол-ва окон: $windows = Get-Process -Name FastExecuteScript | ForEach-Object { $_.MainWindowTitle } | Where-Object { $_ -ne }; $windows.Count
Ошибка: = : The term = is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:2
+ = Get-Process -Name FastExecuteScript | ForEach-Object { .MainWind ...
+ ~ + CategoryInfo : ObjectNotFound: (=:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
.Count : The term .Count is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:106
+ ... ForEach-Object { .MainWindowTitle } | Where-Object { -ne }; .Count
+ ~~~~~~ + CategoryInfo : ObjectNotFound: (.Count:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Скрипт завершен: 19.05.2024, 17:18:34

Код для исправления ошибки

const { exec } = require(child_process);
const fs = require(fs);
const path = require(path);
// Лог-файл
const logFile = path.join(C:\\Users\\Administrator\\Downloads, 1logggg.txt);
fs.writeFileSync(logFile, `Скрипт запущен: ${new Date().toLocaleString()}\n`);
// Функция для записи в лог
function log(message) { fs.appendFileSync(logFile, `${message}\n`);
}
// Функция для выполнения команд и получения результата
function execCommand(command) { return new Promise((resolve, reject) => { exec(command, { shell: powershell.exe }, (error, stdout, stderr) => { if (error) { reject(stderr.trim()); } else { resolve(stdout.trim()); } }); });
}
// Функция для получения количества видимых окон для процесса
async function getVisibleWindowsCount(processName) { const script = `$windows = Get-Process -Name ${processName} | ForEach-Object { $_.MainWindowTitle } | Where-Object { $_ -ne }; $windows.Count`; log(`Используем команду для получения кол-ва окон: ${script}`); return execCommand(`powershell -command ${script}`);
}
// Основная функция
async function main() { try { log('Проверка процессов FastExecuteScript.exe'); // Получаем список процессов FastExecuteScript.exe const tasklistOutput = await execCommand('tasklist /FI "IMAGENAME eq FastExecuteScript.exe" /FO CSV /NH'); const processes = tasklistOutput.split('\n').filter(line => line.trim() !== '').map(line => { const columns = line.split('","').map(col => col.replace(/"/g, '').trim()); return { pid: columns[1], name: "FastExecuteScript" }; // имя процесса без расширения }); log(`Общее количество процессов FastExecuteScript.exe: ${processes.length}`); if (processes.length > 0) { for (const process of processes) { // Получаем количество видимых окон для процесса const visibleWindowsCount = await getVisibleWindowsCount(process.name); log(`Процесс FastExecuteScript.exe с ID ${process.pid} имеет ${visibleWindowsCount} видимых окон(а)`); // Если видимых окон больше одного, завершаем процесс if (parseInt(visibleWindowsCount) > 1) { log(`Процесс FastExecuteScript.exe с ID ${process.pid} имеет больше одного видимого окна. Закрытие процесса.`); await execCommand(`taskkill /PID ${process.pid} /T /F`); } else { log(`Процесс FastExecuteScript.exe с ID ${process.pid} имеет одно или меньше видимых окон.`); } } } else { log('Нет запущенных процессов FastExecuteScript.exe'); } } catch (error) { log(`Ошибка: ${error}`); } finally { log(`Скрипт завершен: ${new Date().toLocaleString()}`); }
}
main();