簡體   English   中英

如何在運行之前更新當前腳本?

[英]How can I update the current script before running it?

我們有一些PowerShell腳本存在於網絡共享A上,並且這些腳本的最新版本位於只讀網絡共享B上。只讀共享是構建系統的輸出,它在路徑中具有內部版本號。 部分是出於習慣,部分原因是腳本必須在磁盤上創建文件,但主要是因為路徑是可預測的,我們在執行它們之前將PowerShell腳本復制到網絡共享A. 問題是我們並不總是將腳本復制到網絡共享A,所以有時這些腳本已經過時了。

我正在嘗試創建一個腳本來更新網絡共享A上的PowerShell腳本(通過從共享B復制最新版本),然后執行這些最新腳本。 現在,我的想法是創建一個小腳本,從共享B中獲取最新腳本,將其復制到共享A,然后在共享A上執行該腳本。

是否可以自行更新腳本? 即,我可以擁有一個腳本(存在於共享A上)而不是擁有兩個腳本,它可以將較新版本本身從共享B復制到共享A,然后重新啟動自身的執行? (我會提出一些關於文件創建日期的邏輯,這樣在第一次執行時,它會自行更新,在第二次執行時,它將運行腳本的實際內容。)

是的,您可以更新正在運行的腳本,然后再次執行。 (只需確保在更新后退出第一個腳本。)這是我創建的一些示例代碼:

Write-Host "Starting script"
if ($(Get-Item G:\selfUpdater2.ps1).CreationTimeUtc -gt $(Get-Item G:\selfUpdater.ps1).CreationTimeUtc) {
    Copy-Item G:\selfUpdater2.ps1 G:\selfUpdater.ps1
    $(Get-Item G:\selfUpdater.ps1).CreationTimeUtc = [DateTime]::UtcNow
    &G:\selfUpdater.ps1
    exit
}
Write-Host "Continuing original script; will not get here if we updated."

請注意,如果要傳遞參數,則必須將它們傳遞給目標腳本。 由於您更新的腳本可能具有比當前腳本更多或更少的參數(一些綁定,一些綁定當前腳本),您需要遍歷$script:MyInvocation.BoundParameters$script:MyInvocation.UnboundArguments來選擇所有這些並傳遞給他們。

(就我個人而言,我使用Invoke-Expression ".\\scriptName.ps1 $stringOfArguments"比使用&.\\scriptName.ps1 $arguments傳遞隨機參數&.\\scriptName.ps1 $arguments ,但你的里程可能會有所不同 - 或者你可能知道更多PowerShell比我做的。如果你使用Invoke-Expression ,那么一定要在任何有空格的參數周圍重新添加引號。)

有一個缺點:如果在腳本的未來版本中刪除了必需的腳本參數,那么您需要使用no-longer-mandatory參數至少運行一次腳本,然后才能更新自身允許您刪除參數。

這是我放在一起的功能。 將它傳遞給可能包含較新版本的文件的路徑。 這將自動更新,然后使用傳遞給原始腳本的任何參數重新運行。

  function Update-Myself
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true,
                   Position = 0)]
        [string]$SourcePath
    )
    #check that the destination file exists
    if (Test-Path $SourcePath)
    {
    #The path of THIS script
    $CurrentScript = $MyInvocation.ScriptName
        if (!($SourcePath -eq $CurrentScript ))
        {
            if ($(Get-Item $SourcePath).LastWriteTimeUtc -gt $(Get-Item $CurrentScript ).LastWriteTimeUtc)
            {
                write-host "Updating..."
                Copy-Item $SourcePath $CurrentScript 
                #If the script was updated, run it with orginal parameters
                &$CurrentScript $script:args
                exit
            }
        }
    }
    write-host "No update required"
}

Update-Myself \\path\to\newest\release\of\file.ps1

暫無
暫無

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

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