1

Я написал функцию 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

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

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

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

%WINDIR%\SysNative\WindowsPowerShell\v1.0\PowerShell.exe

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .