为什么这个特定的PowerShell命令在.net 6中失败(它曾经在.net 4中工作)



我有一个项目使用这个代码

PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-NetAdapterHardwareInfo");
var NetAdapters = ps.Invoke();

这段代码在。net 4.7.2项目中工作得很好,但是在转换到。net6 (net6.0-windows)之后,它在运行时执行Invoke()行时会抛出这个异常:

System.Management.Automation。CommandNotFoundException:术语'Get-NetAdapterHardwareInfo'不被识别为cmdlet、函数、脚本文件或可执行程序的名称。
检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后再试一次。

我用get-help命令测试了相同的代码,以确保PowerShell能够执行-并且它成功了。只有这个特定的get-netadapterhardwareinfo是失败的,它确实在我的本地PowerShell以及。net 4.7.2中工作。

这些是我为项目添加的参考(注意它构建得非常好)

<ItemGroup>
<PackageReference Include="Microsoft.PowerShell.SDK" Version="7.2.8" />
<PackageReference Include="System.Diagnostics.PerformanceCounter" Version="7.0.0" />
<PackageReference Include="System.Management" Version="7.0.0" />
<PackageReference Include="System.Management.Automation" Version="7.2.8" />
</ItemGroup>

失败的原因是什么?有什么解决办法或者我错过了什么吗?

正如mklement0所评论的那样,您需要导入NetAdapter模块:

PowerShell ps = PowerShell.Create();
ps.AddStatement().AddCommand("Import-Module").AddParameter("Name", "NetAdapter");
ps.AddStatement().AddCommand("Get-NetAdapterHardwareInfo");
var result = ps.Invoke();

但是这可能返回零结果。我认为,环境没有初始化或阻塞。对于测试,您可以为PowerShell运行空间创建一个具有不受限制策略的新会话。

Collection<PSObject> result;
InitialSessionState state = InitialSessionState.CreateDefault();
state.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Unrestricted;
using (Runspace runspace = RunspaceFactory.CreateRunspace(state))
{
runspace.Open();
using (PowerShell ps = PowerShell.Create(runspace))
{
ps.AddStatement().AddCommand("Import-Module").AddParameter("Name", "NetAdapter");
ps.AddStatement().AddCommand("Get-NetAdapterHardwareInfo");
result = ps.Invoke();
}
runspace.Close();
}

最新更新