簡體   English   中英

如何使用參數從另一個ps1調用一個ps1

[英]How to call one ps1 from other ps1 with parameters

下面是我的 powershell 腳本,如果 azure VM 使用恢復服務保管庫,它將執行備份。 現在我已經將我的 Powershell 腳本分開,一個用於創建 RSV,創建新的備份策略,調用備份 powershell 腳本並禁用該策略。第二個 powershell 腳本將僅使用現有 RSV 備份 VM。因此,為了從備份策略腳本調用備份腳本連同參數,我嘗試的多種方式都出現錯誤。 我找不到執行此操作的最佳方法。請幫助我了解如何使用參數/參數從一個 powershell 腳本調用另一個 powershell 腳本。

下面的命令我在我的 else 塊中嘗試用 arguments 調用其他 powershell 腳本,但它們都沒有給出解決方案並拋出錯誤。

**

# Invoke-Command -ComputerName server -ScriptBlock $sb
    # [PowerShell]::Create().AddCommand($PSScriptRoot+ "\vmbackup.ps1").AddParameters(@{ Storagetype = "LocallyRedundant"; WorkLoadType = "AzureVM" }).Invoke()
        # & ((Split-Path $MyInvocation.InvocationName) + "\vmbackup.ps1")
        # Invoke-Item (start powershell ((Split-Path $MyInvocation.InvocationName) + "\vmbackup.ps1"))
        #  $script = $PSScriptRoot+"\vmbackup.ps1"
        #  . $script -SourceVMname `"$SourceVMname`" -WorkLoadType `"$WorkLoadType`"
        # "-file $PSScriptRoot\vmbackup.ps1 -SourceVMname `"$SourceVMname`" -WorkLoadType `"$WorkLoadType`""
        # & .\vmbackup.ps1 $WorkLoadType $SourceVMname
        # Invoke-Expression -Command ".\vmbackup.ps1 $WorkLoadType $SourceVMname" 
        # Invoke-Expression "$PSScriptRoot\vmbackup.ps1" -ContainerType $WorkLoadType -FriendlyName $SourceVMname
        # Invoke-Expression "$PSScriptRoot\vmbackup.ps1" $WorkLoadType $SourceVMname

**

vm備份策略.ps1

####################### Paramaters for the VM Backup Process #######################
param (
    [Parameter(Mandatory = $false)][String]$ResourceGroupName,
    [Parameter(Mandatory = $false)][String]$SourceVMname,
    [Parameter(Mandatory = $false)][String]$RSVaultname,
    [Parameter(Mandatory = $false)][String]$PolicyName,
    [Parameter(Mandatory = $false)][String]$Location,
    [Parameter(Mandatory = $false)][String]$Storagetype,
    [Parameter(Mandatory = $false)][String]$WorkLoadType
)

 $argumentList = @()
$argumentList += ("`"$WorkLoadType`"", "`"$SourceVMname`"")
####################### Connecting to Azure via Service principal and install the AZ modules #######################
Write-Host "Check for AZ modules and install the AZ modules if not available"
    if (-not(Get-Module -Name Az.Accounts -ListAvailable)){
        Write-Warning "Module 'Az.Accounts' is missing or out of date. Installing module now."
        Install-Module -Name Az.Accounts, Az.Resources, Az.Automation, Az.RecoveryServices -Scope CurrentUser -Force -AllowClobber
    }

####################### Registering the Azure Recovery Service provider in the subscription #######################

Write-Host "Registering the Azure Recovery Service provider in the subscription"
try {
    Register-AzResourceProvider -ProviderNamespace "Microsoft.RecoveryServices" -ErrorAction SilentlyContinue
}
catch {
    $message = $_
    Write-Warning "An error occurred! $message"
}

#######################  Check if RSV is exist,create if not exist already and setup vault context ####################### 
Write-Host "Check if RSV is exist,create if not exist already and setup vault context"
Get-AzRecoveryServicesVault -ResourceGroupName $ResourceGroupName -Name $RSVaultname -ErrorVariable notPresent -ErrorAction SilentlyContinue
if ($notPresent) {
    New-AzRecoveryServicesVault -Name $RSVaultname -ResourceGroupName $ResourceGroupName -Location $Location
    Get-AzRecoveryServicesVault -Name $RSVaultname | Set-AzRecoveryServicesVaultContext


####################### Fetching vault resource values #######################
Write-Host "Fetching vault resource values"
$targetVault = Get-AzRecoveryServicesVault -ResourceGroupName $ResourceGroupName -Name $RSVaultname
$targetVault.ID

####################### Setting up VaultContext using Vault and Setting up Storage redundancy #######################
Write-Host "Setting up VaultContext using Vault and Setting up Storage redundancy"
Set-AzRecoveryServicesVaultContext -Vault $targetVault
Set-AzRecoveryServicesBackupProperty -Vault $targetVault -BackupStorageRedundancy $Storagetype

####################### Setting up new backup policy #######################
Get-AzRecoveryServicesBackupProtectionPolicy -Name $PolicyName -VaultId $targetVault.ID -ErrorVariable notPresent -ErrorAction SilentlyContinue
if ($notPresent) {
    Write-Host "Setting up a new valid Backup Policy"
    $schPol = Get-AzRecoveryServicesBackupSchedulePolicyObject -WorkloadType $WorkLoadType
    $UtcTime = Get-Date -Date 0001-01-01T00:00:00 #This is the time that you want to start the backup
    $UtcTime = $UtcTime.ToUniversalTime()
    $schpol.ScheduleRunTimes[0] = $UtcTime
    $retPol = Get-AzRecoveryServicesBackupRetentionPolicyObject -WorkloadType $WorkLoadType
    New-AzRecoveryServicesBackupProtectionPolicy -Name $PolicyName -WorkloadType $WorkLoadType -RetentionPolicy $retPol -SchedulePolicy $schPol -VaultId $targetVault.ID
}
$pol = Get-AzRecoveryServicesBackupProtectionPolicy -Name $PolicyName -VaultId $targetVault.ID
$pol

####################### Enable Backup protection in the new Policy #######################
Write-host "Enable Backup protection in the $PolicyName"
try {
   
    Enable-AzRecoveryServicesBackupProtection -ResourceGroupName $ResourceGroupName -Name $SourceVMname -Policy $pol -ErrorAction SilentlyContinue
}
catch {
    $message = $_
    Write-Warning "An error occurred! $message"
}

####################### Checking the status of backup jobs and wait until its configuring the backup #######################
Write-Host "Checking the status of Configure backup jobs and wait until its configuring the backup"
$ConfigureBackup=Get-AzRecoveryservicesBackupJob
while ($ConfigureBackup.Status -eq "In progress") {
    start-sleep -s 30
    write-host "Configure Backup is still in progress"
}
$script = $PSScriptRoot+"\vmbackup.ps1"
& $script


####################### Disable backup protection in the RSV #######################
Write-Host "Disable backup protection in the RSV"
try {
    $containers = Get-AzRecoveryServicesBackupContainer -ContainerType $WorkLoadType -FriendlyName $SourceVMname
    $backupItems = Get-AzRecoveryServicesBackupItem -Container $containers[0] -WorkloadType $WorkLoadType
    # Disble the backup protection in RSV to delete backup items
    Disable-AzRecoveryServicesBackupProtection -Item $backupItems -Force
    Write-Host "Backup is successfully disabled"
}
catch {
    $message = $_
    Write-Warning "An error occured! $message"
}
                  }
else {
     $script = $PSScriptRoot+"\vmbackup.ps1"
     & $script $argumentList
    
}

Vmbackup.ps1 (這是從 vmbackupplicy.ps1 調用的我的腳本)

####################### Paramaters for the VM Backup Process #######################
param (
    [Parameter(Mandatory = $false)][String]$ResourceGroupName,
    [Parameter(Mandatory = $false)][String]$SourceVMname,
    [Parameter(Mandatory = $false)][String]$RSVaultname,
    [Parameter(Mandatory = $false)][String]$PolicyName,
    [Parameter(Mandatory = $false)][String]$Location,
    [Parameter(Mandatory = $false)][String]$Storagetype,
    [Parameter(Mandatory = $false)][String]$WorkLoadType
)

Get-AzRecoveryServicesVault -Name $RSVaultname | Set-AzRecoveryServicesVaultContext

####################### Fetching vault resource values #######################
Write-Host "Fetching vault resource values"
$targetVault = Get-AzRecoveryServicesVault -ResourceGroupName $ResourceGroupName -Name $RSVaultname
$targetVault.ID

####################### Setting up VaultContext using Vault and Setting up Storage redundancy #######################
Write-Host "Setting up VaultContext using Vault and Setting up Storage redundancy"
Set-AzRecoveryServicesVaultContext -Vault $targetVault
# Set-AzRecoveryServicesBackupProperty -Vault $targetVault -BackupStorageRedundancy $Storagetype

####################### Fetching the right container and backup items #######################
Write-Host "Fetching the right container and backup items"
$backupcontainer = Get-AzRecoveryServicesBackupContainer -ContainerType $WorkLoadType -FriendlyName $SourceVMname
$item = Get-AzRecoveryServicesBackupItem -Container $backupcontainer -WorkloadType $WorkLoadType

####################### Check if backup is already in progress or Transfer data to vault process is running #######################
Write-Host "Backup process begins"
$backupjob=Backup-AzRecoveryServicesBackupItem -Item $item
$backupjob
start-sleep -s 60

####################### Fail the pipeline if backup is failed #######################

if ($backupjob.Status -eq "Failed") {
   throw "Backup is failed"
}

####################### Get the Backup Status #######################
Write-Host "Current Backup Status"
Get-AzRecoveryservicesBackupJob

####################### Look for the backup subtask: Take Snapshot in RSV for Backup job and wait for it to complete #######################
Write-Host "Look for the backup subtask: Take Snapshot in RSV for Backup job and wait for it to complete"
$Jobs = Get-AzRecoveryServicesBackupJob -Status InProgress -VaultId $targetVault.ID
$JobId = $Jobs[0].JobId
DO {
   $subtasks = Get-AzRecoveryServicesBackupJobDetail -JobId $JobId -VaultId $targetVault.ID
   $subtask = $subtasks.SubTasks | Where-Object { $_.Name -eq "Take Snapshot" }
   $subtask.Status
   Start-Sleep -Seconds 20
}UNTIL ($subtask.Status -eq "Completed")

####################### Fail the pipeline if backup is failed #######################
try { 
   if ($backupjob.Status -eq "Failed") {   
       throw "Backup is failed"
   }
}
catch {
   $message = $_
   Write-Warning "An error occurred! $message"
}
start-sleep -s 30
####################### Here is the final backup status #######################
Write-Host "Here is the final backup status"
Get-AzRecoveryservicesBackupJob
Write-Output "Backup process is completed successfully"

如果你有腳本的路徑,你可以像這樣使用&而不是Invoke-Expression

& $PSScriptRoot\vmbackup.ps1 -ContainerType $WorkLoadType -FriendlyName $SourceVMname

參考: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7.2#call-operator-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM