如何在 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)}$" } };
使用 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)}$" } };