我编写了一个名为的函数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 起可用。所有开发人员都在 Windows 10 上安装了 PowerShell 5.1。
那么为什么命令无法识别?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
在这种情况下,常见的问题是 Visual Studio 2017 是 32 位的,因此默认情况下会调用 32 位版本的 PowerShell。但是在 64 位 Windows 上手动启动 PowerShell 时,您使用的是 64 位版本的 PowerShell。
这导致 PowerShell 在 Visual Studio 内部的执行方式与在 Visual Studio 外部的执行方式不同。
解决方案是使用以下语法从 Visual Studio 中专门调用 64 位版本:
%WINDIR%\SysNative\WindowsPowerShell\v1.0\PowerShell.exe