使用Azure VM Javascript SDK从RunCommand获取StdOut

时间:2019-01-11 18:49:29

标签: javascript node.js azure azure-virtual-machine runcommand

我在Node.js WebApp中使用Azure VM Javascript SDK。我正在尝试使用RunCommand Function在我的Azure虚拟机上运行自定义脚本。

我遇到的问题是从运行应包含StdOut和StdErr字符串的命令获取响应。

如果我从Azure CLI运行命令,则如下所示:

az vm run-command invoke -g 'myResource' -n 'myVm' --command-id RunPowerShellScript --scripts 'Get-ChildItem -Name'

然后我可以收到回复,例如(请注意,在“消息”部分中,列出了从“ Get-ChildItem”返回的文件)

{
  "value": [
    {
      "code": "ComponentStatus/StdOut/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "myTxtFile.txt\nscript12.ps1\nscript13.ps1\nscript14.ps1\nscript15.ps1\nscript16.ps1\nscript17.ps1\nscript18.ps1\nscript19.ps1\nscript20.ps1\nscript21.ps1\nscript22.ps1\nscript23.ps1\nscript24.ps1\nscript25.ps1\nscript26.ps1",
      "time": null
    },
    {
      "code": "ComponentStatus/StdErr/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "",
      "time": null
    }
  ]
}

但是,当我从javascript SDK运行此代码时,我没有得到任何回报。这是代码:

let usr = ...;
let pas = ...;
let subscriptionId = ...;
let client = null;
msRestAzure.loginWithUsernamePassword(usr, pas, function(err, credentials) {
    if (err) return console.log(err);
    client = new azureArmCompute.ComputeManagementClient(credentials, subscriptionId);

    let param = {
        commandId: 'RunPowerShellScript',
        script: [
            'echo $null >> myTxtFile.txt\n' + 
            'Get-ChildItem -Name\n'
        ]
    };
    client.virtualMachines.runCommand('myResource', 'myVm', param, function (err, result) {
        console.log(err);
        console.log(result);
    })


});

这是控制台上显示的内容:

null
{}

我知道该脚本实际上正在运行,因为我尝试并且能够创建文本文件(myTxtFile.txt)。

有人对我为什么在结果对象中什么都没得到有任何线索吗?

编辑1(以回复@Itay):

从源头来看,回调应该是类型为“ RunCommandResult”的“ ServiceCallback”。这是RunCommand的三个函数声明。 RunCommand Function Declarations

这是ServiceCallback接口的声明。 ServiceCallback interface

因此,在我的回调中,我期望有四个返回值“ err”,“ result”,“ request”和“ response”(我显然省去了后两个)。在我的示例中,我将错误和结果对象打印到控制台,但是结果对象中没有任何内容...

1 个答案:

答案 0 :(得分:0)

我认为您定义的回调的签名与文档中所描述的不一致。

runCommand(string, string, RunCommandInput, ServiceCallback< RunCommandResult >)看,回调似乎应该接受RunCommandResult interface,后者包含一个名为Value的属性,该属性是InstanceViewStatus interface实例的数组可能包含您要查找的信息。

希望有帮助!