需要运行PowerShell脚本的Azure Cloud Service Startup任务

时间:2015-09-30 05:24:37

标签: powershell azure azure-cloud-services

所有

注意: 我在收到一些反馈后更新了问题。

感谢 @jisaak 给予他的帮助。

我需要运行PowerShell脚本,在部署Cloud Service时添加TCP绑定和其他一些东西。

以下是我的云服务项目:

enter image description here

这是我的Cloud Service Project和Webrole项目: enter image description here

这是我在ServiceDefinition.csdef中的任务:enter image description here

这是我想要运行的PowerShell脚本: enter image description here

这是我对Startup.cmd的尝试: enter image description here

部署时,我在Azure日志中获取此信息: enter image description here

这是在powershell日志中: enter image description here

非常感谢任何帮助。

我认为我差不多了,但在网络上关注其他人的语法似乎并不能让我在那里。

感谢 拉斯

4 个答案:

答案 0 :(得分:3)

我认为问题是批处理命令解释程序在运行Startup.cmd时的工作目录运行不符合预期。

Startup.cmd位于\approot\bin\Startup目录中,但工作目录为\approot\bin

因此,命令.\RoleStartup.ps1无法找到RoleStartup.ps1,因为它在bin目录中查找而不是bin\Startup目录。

我知道的解决方案是:

解决方案1 ​​: 使用..\Startup\RoleStartup.ps1从Startup.cmd调用RoleStartup.ps1。

Soltuion 2 : 更改Startup.cmd中的当前工作目录,以便找到相对路径.\RoleStartup.ps1。我通过CHDIR %~dp0执行此操作(请参阅here)以更改为包含Startup.cmd的目录。

解决方案3 : 正如Don Lockhart的回答建议的那样,不要将Startup目录复制到输出中,而是将其设置为" Content"在Visual Studio项目中。这意味着其中的文件将存在于Azure实例的\approot\Startup目录中。 (然后,您需要确保通过IIS无法公开访问Startup文件夹!)。然后将ServiceDefinition.csdef中对Startup.cmd的引用更新为..\Startup\Startup.cmd,并将Startup.cmd中对RoleStartup.ps1的引用更新为..\Startup\RoleStartup.ps1。这适用于工作目录为bin并使用..\Startup来始终找到相对于它的Startup目录的事实。

答案 1 :(得分:0)

您不需要在cmd中设置executionpolicy - 只需调用脚本即可。此外,您应该使用相对路径,因为您不能依赖C磁盘。

将您的批次更改为:

powershell -executionpolicy unrestricted -file .\RoleStartup.ps1

右键单击Visual Studio中的RoleStartup.ps1Startup.cmd,确保Copy to Output directory设置为copy always

如果仍然无效,请删除csdef中的启动调用,将服务rdp部署到其中,然后尝试自行调用脚本以检索任何错误。

修改:

尝试采用以下脚本:

Import-Module WebAdministration

$site = $null

do # gets the first website until the result is not $null
{
    $site = Get-WebSite | select -first 1
    Sleep 1
}
until ($site)

# get the appcmd path
$appcmd = Join-Path ([System.Environment]::GetFolderPath('System')) 'inetsrv\appcmd.exe'

# ensure the appcmd.exe is present
if (-not (Test-Path $appcmd))
{
    throw "appcmd.exe not found in '$appcmd'"
}

# The rest of your script ....

答案 2 :(得分:0)

我发现过去不容易将内容复制到输出目录。我已经批准\ bin作为工作目录。我的startUp任务元素的commandLine属性使用对.cmd文件的相对引用,如下所示:

enter image description here

.cmd文件也相对于工作目录引用PowerShell脚本:

PowerShell -ExecutionPolicy Unrestricted -f ..\StartUp\RoleStartup.ps1

答案 3 :(得分:0)

确定,

因此,经过多次不同尝试才能使其恢复正常。 我尝试过使用:

  • ServiceDefinition.csdef
  • 中的启动配置
  • 我已尝试在扫描Windows Azure日志的服务器上注册计划任务,以查找[System [Provider [@Name =' Windows Azure Runtime 2.6.0.0']和EventID = 10004]]

由于安全性或事件的时间安排以及IIS尚未完全设置,没有任何工作。

所以我终于咬了一口子并使用了我的Webrole.cs => public override bool OnStart()方法: enter image description here

在ServiceDefinition.csdef中结合使用: enter image description here

现在一切正常。这是最令人满意的结果,因为其他一些方法感觉更优雅。此外,许多其他人发布了他们获得其他工作方式。也许我最终会到达那里,但我的时间有限。

感谢 拉斯