如何在 vSphere 中查询现有虚拟机?

How do I query vSphere for an existing virtual machine?

使用 VMware.Vim 库(我认为是 PowerCLI 的一部分)我试图找到 vSphere 中存在的特定机器。我的代码如下所示:

using VMware.Vim;
var client = new VimClient();
client.Connect("http://my-vsphere/sdk");
client.Login("username", "password");

var filter = new NameValueCollection();
filter.Add("name", "my-vm-name");
var vms1 = client.FindEntityViews(typeof(VirtualMachine), null, filter, null);
// vms1 is null here. WTF?

var vms2 = client.FindEntityViews(typeof(VirtualMachine), null, null, null);
foreach (VirtualMachine vm in vms)
{
    if(vm.Name = "my-vm-name")
    {
        Console.WriteLine("Found it!");
    }
}
// This works!

基本上按照SDK文档中的方法,我是找不到机器的。如果我盲目查询所有机器并遍历集合,我就能找到它。

我是不是遗漏了什么?

我想通了...我正在查看的 SDK 文档中没有提到这一点,但是添加到过滤器的字符串值不是原始字符串;它们是正则表达式。

在我的情况下,机器名称的格式为 "Machine (Other Info)"。如果将该字符串传递到过滤器 "as-is" 中,它将失败。如果括号被转义,如 "Machine \(Other Info\)" 搜索将成功。

您可以使用 Regex.Escape 作为用户输入:

var filter = new NameValueCollection { { "name", $"^{Regex.Escape(name)}$" } };