【问题标题】:Azure: Unable to start cloud service running vbs startup taskAzure:无法启动运行 vbs 启动任务的云服务
【发布时间】:2013-07-26 11:05:08
【问题描述】:

出于某些特定目的,我需要在实例上安装一些字体。当我选择 StartUp Task 来实现这个目标时,这并不奇怪。我已将服务定义配置如下:

<Startup>
  <Task commandLine="Fonts\InstallFonts.vbs" executionContext="elevated" taskType="simple" />
</Startup>

这里没什么特别的。单击并运行,它失败了。但是,如果我将 commandLine 更改为包含废话的 cmd 文件,即“echo test”,则该实例将毫不费力地运行。所以我的脚本一定有问题:

Const FONTS = &H14&

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(CreateObject("Scripting.FileSystemObject").GetAbsolutePathName("."))
Set fontFolder = objShell.Namespace(FONTS) 

Set rxTTF = New RegExp
rxTTF.IgnoreCase = True
rxTTF.Pattern = "\.ttf$"

Set fso = CreateObject("Scripting.FileSystemObject")

FOR EACH FontFile IN objFolder.Items()
    IF rxTTF.Test(FontFile.Path) THEN
        IF NOT fso.FileExists(fontFolder.Self.Path+"\\"+FontFile.Name) THEN
         FontFile.InvokeVerb("Install")
        END IF
    END IF
NEXT

该脚本应该没有错误,因为我已经在本地或通过 RDP 在 Azure 上对其进行了测试。

奇怪的是,当我把它放在启动中时,这个角色就不会启动。该实例只是不断循环,最后说“我不健康”。即使我将 vbs 弃用为一行代码——第一行 Const FONTS = &H14&,它也不会启动。即使我将 vbs 的调用包装到一个 cmd 文件中,即放入类似“cscript /B file.vbs”之类的东西,它也不会运行。

所以我的结论是,脚本和 Windows Azure 监视器之间的通信一定存在一些问题。我不确定,但我认为监视器可能会将正在运行的脚本视为失败的任务。此外,我想知道启动任务是否有任何超时,但这应该是问题所在,因为脚本可以保证没有UI交互阻塞进程。

任何想法将不胜感激。

【问题讨论】:

    标签: asp.net-mvc iis azure vbscript windows-server-2012


    【解决方案1】:

    我相信您一定有,但只是为了确认,您是否检查了 InstallFonts.vbs 文件是否与包一起导出?我的意思是“复制到输出目录”设置为“始终复制/如果更新则复制”?

    这很可能是它无法找到您的文件。

    【讨论】:

    • 如果较新,则为副本。此外,我在发布之前手动检查了两个文件之间的一致性。顺便说一句,一些 unicode 文件名(字体)在发布后会损坏。这很奇怪,但是在我将命名更改为标准字母后应该一切都好。
    【解决方案2】:

    您需要编写一个 cmd 文件作为启动任务。在您的 cmd 文件中,您可以使用命令行工具 cscript 调用 vbs 文件。 Azure 启动只能编译命令行工具。

    【讨论】:

    • 正如帖子中所写,我也尝试过,但似乎没有奏效。事实上,如果我根本不调用 vbs 就可以了。我想VB脚本引擎的调用方式可能有问题。
    【解决方案3】:

    天哪,我终于解决了这个问题。

    虽然编译器通常做得很好,但它允许使用子文件夹作为命令源,我的意思是像“Subfolder\command.cmd”这样的东西,它并不总是有效。我见过一些例子,人们将我们在 cmd 中所做的任何事情都放在 commandLine 属性中,例如“copy fileA fileB”,它确实有效。但是对于vbs,你需要谨慎。直到现在我仍然不知道封面下是什么,但是路径应该有问题。而且解决方法也很简单,不用为了整洁而做子文件夹的工作,就像大多数人一样,把命令文件留在根文件夹中:

    <Startup>
      <Task commandLine="InstallFonts.vbs" executionContext="elevated" taskType="simple" />
    </Startup>
    

    同样感谢你,Kunal。 :)

    【讨论】:

      最近更新 更多