首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在主脚本中运行一段代码,然后用上述代码的结果更新主脚本

如何在主脚本中运行一段代码,然后用上述代码的结果更新主脚本
EN

Stack Overflow用户
提问于 2022-07-30 17:08:25
回答 1查看 79关注 0票数 0

下面的代码是大主脚本的一部分,因为日期是随机的,所以我不能预先编写显示格式,所以我正在生成显示代码。所以使用下面的代码来格式化显示。

代码语言:javascript
复制
$dates = ("2022-07-29","2022-07-28","2022-07-27")
    function display ($dates){
                $num = 1
                $beg = '"{0,-25}'
                $end = '" -f "Job_Name"'
                    ForEach ($dt in $dates){
                
                $ft += " {$num,10}"
                
                $dtt += ",""$dt"""
                $num ++
                                                }
                "$($beg) $($ft) $($end)$($dtt)"
                                    }
                
               display $dates

当主脚本运行时,我将获得如下所示的输出,我希望在主脚本中运行代码并使用输出更新脚本。"{0,-25} {1,10} {2,10} {3,10}“-f "Job_Name”、"2022-07-29“、"2022-07-28”、"2022-07-27“在主脚本运行时显示为

Job_name 2022-07-29 2022-07-28 2022-07-27

实际上,下面是我的主要代码,在这里,我在代码中手动编写日期以获得输出。但是我想要这件自动的,知道我能做什么吗?

代码语言:javascript
复制
[CmdletBinding()]
param (
    [Parameter(Mandatory = $True)][string]$vip,
    [Parameter(Mandatory = $True)][string]$username,
    [Parameter()][string]$domain = 'local',
    [Parameter(Mandatory = $True)][array]$jobNames, # job to run
    [Parameter()][int]$Days
)

### source the cohesity-api helper code
. ./cohesity-api

### authenticate
apiauth -vip $vip -username $username -domain $domain

$dayusec  = [int64](((Get-Date).ToUniversalTime())-([datetime]"1970-01-01 00:00:00")).TotalSeconds*1000000

$TB = 1024*1024*1024*1024

$dateString = (get-date).ToString().Replace(' ','_').Replace('/','-').Replace(':','-')
$outfileName = "RunStats-$dateString.csv"
"JobName,Job start Time,Status,RunType,Duration in Min, ReadGBytes, writeGBytes" | Out-File -FilePath $outfileName

$endtime = $dayusec
$data = @{}
$jobs = api get protectionJobs?isDeleted=false
$dates =@()
            for ($day=1;$day -lt $days -or $day  -eq $days;$day ++){
                $dates += ((get-date).AddDays(-$day)).ToString('yyyy-MM-dd')
                                                                  }

foreach ($jobname in $jobNames){   ###1
       $endtime = $dayusec
       
        for ($day=1;$day -lt $days -or $day  -eq $days;$day ++){   ###2
               
               $starttime = [int64](((Get-Date).ToUniversalTime())-([datetime]"1970-01-01 00:00:00")).TotalSeconds*1000000 - ($day * 86400000000)
                    if ($jobname -notin $data.keys){
                             $data[$jobname]=@{}
                                                }


                        foreach ($job in $jobs){     #  starts jobs loop
    
                                         if ( $jobname -eq $job.name){
                                           $jobId = $job.id
                                           #$starttime = $usec
                                           $runs = api get "protectionRuns?jobId=$($job.id)&startTimeUsecs=$starttime&endTimeUsecs=$endtime&runTypes=kRegular"
                                                                     }
                                               }

                            foreach ($run in $runs){
                                $nowTime = dateToUsecs (get-date)
                                $7thday = (dateToUsecs ((Get-Date).AddDays(-7)))
                                $startTime = $run.copyRun[0].runStartTimeUsecs
                                $date =  (usecsToDate $starttime).ToString('yyyy-MM-dd’)
                                        
                                     if ($run.backupRun.runType.substring(1) -eq "Regular"){   #  starts last day
            
                                    $readMBytes = [math]::Round($run.backupRun.stats.totalBytesReadFromSource / $TB, 3)
                                    $data[$jobname][$date]=$readMBytes
                                    
                                    #"$($jobName)     $($readMBytes) $($date)"
                                                                                             }
                 
                            }
                                        $endtime = $starttime
                                        
                                } ###2
                } ###1

                
                "{0,-25} {1,10} {2,10} {3,10} {4,10} {5,10} {6,10} {7,10} {8,10} {9,10} {10,10} {11,10} {12,10} {13,10} {14,10}" -f "Job Name","2022-07-28","2022-07-27","2022-07-26","2022-07-25","2022-07-24","2022-07-23","2022-07-22","2022-07-21","2022-07-20","2022-07-19","2022-07-18","2022-07-17","2022-07-16","2022-07-15"
                
                "==============================================================================================================="
                $data.GetEnumerator()|ForEach-Object {
                "{0,-20} {1,10} {2,10} {3,10} {4,10} {5,10} {6,10}  {7,10} {8,10} {9,10} {10,10} {11,10} {12,10} {13,10}  {14,10}" -f $_.name,$_.value."2022-07-28",$_.value."2022-07-27",$_.value."2022-07-26",$_.value."2022-07-25",$_.value."2022-07-24",$_.value."2022-07-23",$_.value."2022-07-22",$_.value."2022-07-21",$_.value."2022-07-20",$_.value."2022-07-19",$_.value."2022-07-18",$_.value."2022-07-17",$_.value."2022-07-16",$_.value."2022-07-15"

                                                 }

如果您先将日期放在预期的输出上,然后将$days的值从14更改为任何其他值,则必须再次用日期更新上述代码,以获得所需的输出。我想要显示得到调整值的$days变化。

EN

回答 1

Stack Overflow用户

发布于 2022-07-30 21:43:30

相对于您发布的内容,结果并不是您所显示的结果。

(除非您正在脚本的其他地方进行格式化,而您没有显示)

代码语言:javascript
复制
Clear-Host
$dates = ("2022-07-29","2022-07-28","2022-07-27")

function display ($dates)
{
    $num = 1
    $beg = '"{0,-25}'
    $end = '" -f "Job_Name"'

    ForEach ($dt in $dates)
    {         
        $ft  += " {$num,10}"     
        $dtt += ",""$dt"""
        $num ++
    }

    "$($beg) $($ft) $($end)$($dtt)"
}
    
display $dates
# Results
<#
"{0,-25}  {1,10} {2,10} {3,10} " -f "Job_Name","2022-07-29","2022-07-28","2022-07-27"  
#>  

您正在传递一个数组,因此响应应该作为数组处理。

代码语言:javascript
复制
Clear-Host
$dates | 
ForEach-Object {$PSItem}
2022-07-29
2022-07-28
2022-07-27

Clear-Host
$dates | 
ForEach{display -dates $PSitem}
# Results
<#
"{0,-25}  {1,10} " -f "Job_Name","2022-07-29"
"{0,-25}  {1,10} " -f "Job_Name","2022-07-28"
"{0,-25}  {1,10} " -f "Job_Name","2022-07-27"
#>

然后根据需要处理这些输出行。

,和“@iRon”一样。

现在,您的帖子只发送到控制台,如果您需要使用脚本中的其他地方的数据,那么您需要捕获它并以这种方式使用它。

您可以使用PowerShell变量压缩将输出到屏幕并捕获一个变量,以便根据需要使用。

代码语言:javascript
复制
Clear-Host
($DisplayRecords = $dates | 
ForEach{display -dates $PSitem})
# Results
<#
"{0,-25}  {1,10} " -f "Job_Name","2022-07-29"
"{0,-25}  {1,10} " -f "Job_Name","2022-07-28"
"{0,-25}  {1,10} " -f "Job_Name","2022-07-27"
#>

Clear-Host
$DisplayRecords
# Results
<#
"{0,-25}  {1,10} " -f "Job_Name","2022-07-29"
"{0,-25}  {1,10} " -f "Job_Name","2022-07-28"
"{0,-25}  {1,10} " -f "Job_Name","2022-07-27"
#>

然后你可以随心所欲地挑选:

代码语言:javascript
复制
Clear-Host
$DisplayRecords[0]
# Results
<#
"{0,-25}  {1,10} " -f "Job_Name","2022-07-29"
#>

Clear-Host
$DisplayRecords[1]
# Results
<#
"{0,-25}  {1,10} " -f "Job_Name","2022-07-28"
#>

Clear-Host
$DisplayRecords[2]
# Results
<#
"{0,-25}  {1,10} " -f "Job_Name","2022-07-27"
#>

更新-跟进我的评论如下:

代码语言:javascript
复制
Clear-Host
$dates = ("2022-07-29","2022-07-28","2022-07-27")

function display ($dates)
{

    $end = 'Job_Name '

    ForEach ($dt in $dates)
    { $dtt += $dt }

    $end + $dtt
}
    
display $dates
# Results
<#
Job_Name 2022-07-292022-07-282022-07-27 
#>  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73177623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档