出于某些特定目的,我需要在实例上安装一些字体。当我选择StartUp Task来实现这个目标时,这并不奇怪。我已将服务定义配置如下:
<Startup>
<Task commandLine="Fonts\InstallFonts.vbs" executionContext="elevated" taskType="simple" />
</Startup>
这里没什么特别的。点击并运行,它失败了。但是,如果我将commandLine更改为仅包含废话的cmd文件,即“echo test”,则实例将在没有ado的情况下运行。所以我的脚本必须存在一些问题:
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 =&amp; H14&amp;,它就不会启动。即使我将vbs的调用包装到cmd文件中,即放置类似“cscript / B file.vbs”的内容,它也不会运行。
所以我得出的结论是,脚本和Windows Azure监视器之间的通信一定存在问题。我不确定,但我认为监视器可能会将运行脚本作为失败的任务。此外,我想知道启动任务是否有任何超时,这应该是问题,因为脚本可以保证没有UI交互阻止该过程。
任何想法都将不胜感激。
答案 0 :(得分:1)
我相信您必须拥有但仅仅是为了确认,您是否检查过InstallFonts.vbs文件是否与包一起导出?我的意思是“复制到输出目录”设置为“如果更新则复制始终/复制”?
这很可能无法找到您的文件。
答案 1 :(得分:1)
您需要将cmd文件编写为启动任务。在cmd文件中,可以使用命令行工具cscript调用vbs文件。 Azure启动只能编译命令行工具。
答案 2 :(得分:1)
天啊,我终于解决了这个问题。
虽然编译器通常做得相当不错,但它允许使用子文件夹作为命令源,我的意思是“Subfolder \ command.cmd”,它总是不起作用。我已经看过人们把我们在cmd中做的任何事情放在commandLine属性中的例子,例如“copy fileA fileB”,它确实有效。但至于vbs,你需要谨慎。到现在为止,我仍然不知道封面下有什么,但路径上应该有一些问题。解决方案绝对简单,而不是让子文件夹工作整洁,只需将命令文件保留在根文件夹中就像大多数人一样:
<Startup>
<Task commandLine="InstallFonts.vbs" executionContext="elevated" taskType="simple" />
</Startup>
谢谢你们,库纳尔。 :)