Azure: Unable to start cloud service running vbs startup task
出于某些特定目的,我需要在实例上安装一些字体。当我选择 StartUp Task 来实现这个目标时,这并不奇怪。我已将服务定义配置如下:
1 2 3 | <Startup> <Task commandLine="Fonts\\InstallFonts.vbs" executionContext="elevated" taskType="simple" /> </Startup> |
这里没什么特别的。单击并运行,它失败了。但是,如果我将 commandLine 更改为包含废话的 cmd 文件,即"echo test",则该实例将毫不费力地运行。所以我的脚本一定有问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 =
天哪,我终于解决了这个问题。
虽然编译器通常做得很好,但它允许使用子文件夹作为命令的来源,我的意思是像 "Subfolder\\\\\\\\command.cmd" 这样的东西,它不会总是工作。我见过一些例子,人们将我们在 cmd 中所做的任何事情都放在 commandLine 属性中,例如 "copy fileA fileB",它确实有效。但是对于vbs,你需要谨慎。直到现在我仍然不知道封面下是什么,但是路径应该有问题。而且解决方案也很简单,不用为了整洁而做子文件夹的工作,只需像大多数人一样将命令文件留在根文件夹中即可:
1 2 3 | <Startup> <Task commandLine="InstallFonts.vbs" executionContext="elevated" taskType="simple" /> </Startup> |
同样感谢你,Kunal。 :)
您需要编写一个 cmd 文件作为启动任务。在您的 cmd 文件中,您可以使用命令行工具 cscript 调用 vbs 文件。
Azure 启动只能编译命令行工具。
我相信您一定有,但只是为了确认,您是否检查了 InstallFonts.vbs 文件是否与包一起导出?我的意思是"复制到输出目录"设置为"始终复制/如果更新则复制"?
这很可能是它无法找到您的文件。