带时间戳的Powershell数组

带时间戳的Powershell数组,powershell,Powershell,我有以下脚本,它将根据我提供的参数部署Octopus部署版本 param( [string] $releaseVersion, [array] $future ) foreach($line in Get-Content C:\admin\customers.txt) { $ErrorActionPreference = "Stop"; # Define working variables $octopusURL = "http:/

我有以下脚本,它将根据我提供的参数部署Octopus部署版本

    param(
   [string] $releaseVersion,
   [array] $future
   
)

foreach($line in Get-Content C:\admin\customers.txt) {

$ErrorActionPreference = "Stop";

# Define working variables
$octopusURL = "http://10.2.2.62:8022/api"
$octopusAPIKey = "API-Key"
$headers = @{ "X-Octopus-ApiKey" = $octopusAPIKey }
$spaceName = "Default"
$projectName = "C9-Deployment"
$environmentName = "LabFarm2"
$tenantNames = $line
$date = get-date -Format yyyy-MM-dd
$expiredate = $(date).AddDays(1).ToString("yyyy-MM-dd")

# Get space id
$spaces = Invoke-WebRequest -Uri "$octopusURL/spaces/all" -Headers $headers -ErrorVariable octoError | ConvertFrom-Json
$space = $spaces | Where-Object { $_.Name -eq $spaceName }
Write-Host "Using Space named $($space.Name) with id $($space.Id)"

# Get project by name
$projects = Invoke-WebRequest -Uri "$octopusURL/projects/all" -Headers $headers -ErrorVariable octoError | ConvertFrom-Json
$project = $projects | Where-Object { $_.Name -eq $projectName }
Write-Host "Using Project named $($project.Name) with id $($project.Id)"

# Create space specific url
$octopusSpaceUrl = "$octopusURL/$($space.Id)"

# Get release by version
$releases = Invoke-RestMethod -Uri "$octopusSpaceUrl/projects/$($project.Id)/releases" -Headers $headers -ErrorVariable octoError
$release = $releases.Items | Where-Object { $_.Version -eq $releaseVersion }
Write-Host "Using Release version $($release.Version) with id $($release.Id)"

# Get environment by name
$environments = Invoke-RestMethod -Uri "$octopusSpaceUrl/environments?partialName=$([uri]::EscapeDataString($environmentName))&skip=0&take=100" -Headers $headers -ErrorVariable octoError
$environment = $environments.Items | Where-Object { $_.Name -eq $environmentName }
Write-Host "Using Environment named $($environment.Name) with id $($environment.Id)"

$tenants = Invoke-WebRequest -Uri "$octopusSpaceUrl/tenants/all" -Headers $headers -ErrorVariable octoError | ConvertFrom-Json

$tenantNames | ForEach-Object {
    $name = $_
    $tenant = $tenants | Where-Object { $_.Name -eq $name }

if ($future -eq $null) {   
    write-host "This deployment is for tonight"
    $deploymentBody = @{
        ReleaseId     = $release.Id
        EnvironmentId = $environment.Id
        TenantId      = $tenant.Id
        QueueTime     = "${date}T23:00:00"
        QueueTimeExpiry = "${expiredate}T05:00:00"
    } | ConvertTo-Json
}

if ($future -ne $null) {
    write-host "This deployment will take place on $future"
#Problem Line 64 below
    $expirefuturedate = (get-date $future).Adddays(1).ToString("yyyy-MM-dd")
    $deploymentBody = @{
        ReleaseId     = $release.Id
        EnvironmentId = $environment.Id
        TenantId      = $tenant.Id
        QueueTime     = "${future}T23:00:00"
#problem line 70 below
        QueueTimeExpiry = "${expirefuturedate}T05:00:00"
    } | ConvertTo-Json
}

    Write-Host "Creating deployment with these values: $deploymentBody"
    $deployment = Invoke-WebRequest -Uri $octopusSpaceUrl/deployments -Method POST -Headers $headers -Body $deploymentBody -ErrorVariable octoError
}
}
所以问题是在第64行和第70行,我尝试将一天添加到Future参数。如果我只在设置了ReleaseVersion参数的情况下运行它,它将运行良好,不会出现问题。但如果我为future添加一个参数,比如“-future 2021-03-11”,我会得到以下错误:

PS C:\Users\bbelden.CLOUD9\Documents\powershell\Octopus> .\Deploycustom_parm.ps1 -releaseversion 8.1.2103.193 -future 20
21-03-11
Using Space named Default with id Spaces-1
Using Project named C9-Deployment with id Projects-101
Using Release version 8.1.2103.193 with id Releases-12243
Using Environment named LabFarm2 with id Environments-161
This deployment will take place on 2021-03-11
ForEach-Object : Cannot convert 'System.Object[]' to the type 'System.DateTime' required by parameter 'Date'.
Specified method is not supported.
At C:\Users\bbelden.CLOUD9\Documents\powershell\Octopus\Deploycustom_parm.ps1:47 char:16
+ $tenantNames | ForEach-Object {
+                ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ForEach-Object], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.ForEachObjectCommand
现在,如果我完全删除第64行,并在第70行手动设置时间-日期戳,如下所示:

 if ($future -ne $null) {
    write-host "This deployment will take place on $future"
    #$expirefuturedate = (get-date $future).Adddays(1).ToString("yyyy-MM-dd")
    $deploymentBody = @{
        ReleaseId     = $release.Id
        EnvironmentId = $environment.Id
        TenantId      = $tenant.Id
        QueueTime     = "${future}T23:00:00"
        QueueTimeExpiry = "2021-03-11T05:00:00"
    } | ConvertTo-Json
}
它会很好用的。 所以我不确定我在这里错过了什么。如果我做错了什么,请告诉我。我相信这与数组有关,因为如果我对行进行注释,问题就会消失,但我需要一种方法将$future变量转换为向其添加一天


谢谢

这应该可以解释您的错误:

PS /home/> $future=[array]'2021-03-11'
PS /home/> (get-date $future).Adddays(1).ToString("yyyy-MM-dd")
Get-Date: Cannot convert 'System.Object[]' to the type 'System.DateTime' required by parameter 'Date'. Specified method is not supported.
PS /home/> $future=[datetime]'2021-03-11'                      
PS /home/> (get-date $future).Adddays(1).ToString("yyyy-MM-dd")
2021-03-12

这应该可以解释您的错误:

PS /home/> $future=[array]'2021-03-11'
PS /home/> (get-date $future).Adddays(1).ToString("yyyy-MM-dd")
Get-Date: Cannot convert 'System.Object[]' to the type 'System.DateTime' required by parameter 'Date'. Specified method is not supported.
PS /home/> $future=[datetime]'2021-03-11'                      
PS /home/> (get-date $future).Adddays(1).ToString("yyyy-MM-dd")
2021-03-12

读者可以通过在代码中使用注释来指定所引用的行(例如,行下的
#有问题
),而不是引用行号。(对于行号,您假设读者有时间复制和粘贴您的所有代码,并且换行符将完全匹配。最好使用标识问题行的注释。)我强烈建议您重新格式化代码,以正确显示各种脚本块的范围-错误消息使我看到的位置与您指出的完全不同。读者可以通过在代码中使用注释来指定您引用的行(例如,
#下行有问题
)而不是指行号。(对于行号,您假设读者有时间复制和粘贴您的所有代码,并且换行符将完全匹配。最好使用标识问题行的注释。)我强烈建议您重新格式化代码,以正确显示各种脚本块的范围-错误消息使我看到的位置与您指出的完全不同。感谢您的帮助!Np,很高兴为您服务谢谢您的帮助!我很乐意帮忙