关于asp.net mvc:Azure: Unable to start cloud service running vbs startup task

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 文件是否与包一起导出?我的意思是"复制到输出目录"设置为"始终复制/如果更新则复制"?

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