Команды PowerShell не распознаются при вызове из VisualStudio 2017

336
SimonS

Я написал функцию, Deploy-Appкоторую наши разработчики используют в VisualStudio 2017 Build Events > Post-build event command lineдля публикации своего приложения на сетевом ресурсе.

Я написал другую функцию, Invoke-Unlockкоторая называется разблокировка папок + файлов, которые заблокированы на удаленном сервере, прямо с их компьютера.

Прямо сейчас они Invoke-Unlockсначала делают вручную в PowerShell, чтобы приложение разблокировалось в общем сетевом ресурсе, а затем развертывают приложение в VisualStudio.

Теперь я принял Invoke-Unlockучастие, Deploy-Appпоэтому разработчикам больше не нужно делать это вручную. Они могут просто позвонить с помощью переключателя, как это Deploy-App xy -InvokeUnlock.

В Invoke-Unlockя использую Get-SmbShareи Get-SmbOpenFile. Все работало нормально при использовании этой функции вручную, но если они используют ее в VisualStudio, они получают следующее сообщение об ошибке:

9> Get-SmbShare : The term 'Get-SmbShare' is not recognized as the name of a cmdlet, function, script file, or operable  9> program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. 9> At \\server\install$\Powershell-Scripts\Functions\Invoke-Unlock.ps1:28 char:22 9> + $LocalPath = Get-SmbShare -CimSession $Session | ? { $_.Name ... 9> + ~~~~~~~~~~~~ 9> + CategoryInfo : ObjectNotFound: (Get-SmbShare:String) [], CommandNotFoundException 9> + FullyQualifiedErrorId : CommandNotFoundException 9>  9> Get-SmbOpenFile : The term 'Get-SmbOpenFile' is not recognized as the name of a cmdlet, function, script file, or  9> operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try  9> again. 9> At \\server\install$\Powershell-Scripts\Functions\Invoke-Unlock.ps1:32 char:9 9> + Get-SmbOpenFile -CimSession $Session | ? { $_.Path -like "$En ... 9> + ~~~~~~~~~~~~~~~ 9> + CategoryInfo : ObjectNotFound: (Get-SmbOpenFile:String) [], CommandNotFoundException 9> + FullyQualifiedErrorId : CommandNotFoundException 9>  

Эти Smbкоманды доступны начиная с PowerShell 4.0. Все разработчики имеют PowerShell 5.1 на Windows 10.

Так почему же команды не распознаются? VisualStudio каким-то образом использует другую версию PowerShell? У кого-нибудь есть идея?

Изменить: я добавил ipmo SmbShareв начале Invoke-Unlock, чтобы убедиться, что модуль был загружен также в VisualStudio, но затем я получаю это сообщение об ошибке:

ipmo : The specified module 'SmbShare' was not loaded because no valid module file was found in any module directory.

Это заставляет меня думать, что VisualStudio не использует каталоги модуля PowerShell по умолчанию?

1

1 ответ на вопрос

1
harrymc

Обычная проблема в таких случаях заключается в том, что Visual Studio 2017 является 32-разрядной, поэтому по умолчанию будет вызываться 32-разрядная версия PowerShell. Но при запуске PowerShell вручную в 64-битной Windows вы используете 64-битную версию PowerShell.

Это заставляет PowerShell работать не так, как внутри, так и снаружи Visual Studio.

Решение состоит в том, чтобы вызвать 64-разрядную версию из Visual Studio, используя следующий синтаксис:

%WINDIR%\SysNative\WindowsPowerShell\v1.0\PowerShell.exe 
См. [Папка 'Sysnative' в объяснении 64-битной Windows] (http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm) для получения доступа к 64-битным инструментам из 32-битного кода. , Это виртуальная папка, которую можно использовать для перехода к файлу, но ее «содержимое» не может быть указано в списке. harrymc 6 лет назад 0
хорошо ... У меня нет 32-разрядного программного обеспечения для проверки этого, но в cmd.exe, меню запуска Windows, cmd для visualstudio `% WINDIR% \ SysNative \ WindowsPowerShell \ v1.0 \ PowerShell.exe" gci; pause; "не удается, пока работает`% WINDIR% \ System32 \ WindowsPowerShell \ v1.0 \ PowerShell.exe "gci; pause" `. но я позволю разработчикам проверить это и вернуться к вам SimonS 6 лет назад 0
Разработчик только что сказал мне, что `SysNative` Path работает. Большое спасибо Гарри, это было очень полезно SimonS 6 лет назад 0

Похожие вопросы