2013-08-02 68 views
3

我們有一些生活在網絡共享A上的PowerShell腳本,以及生活在只讀網絡共享B上的這些腳本的最新版本。只讀共享是我們的構建系統的輸出,並且其中包含內部版本號路徑。部分原因在於腳本必須在磁盤上創建文件,但主要是因爲路徑是可預測的,所以我們在執行PowerShell腳本之前將它們複製到網絡共享A上。麻煩的是,我們並不總是將腳本複製到網絡共享A,所以偶爾這些腳本已過期。如何在運行之前更新當前腳本?

我試圖創建一個腳本,它將更新網絡共享A上的PowerShell腳本(通過從共享B複製最新版本),然後執行這些最新的腳本。現在,我的想法是有一個小小的腳本,抓住B分享的最新腳本,將它複製到A分享,然後在分享A上執行該腳本。

腳本是否可以自行更新?即,不是有兩個腳本,我可以有一個腳本(以共享A爲生)將本身從共享B複製到共享A,然後重新啓動自己的執行? (我會放入一些有關文件創建日期的邏輯,以便在第一次執行時它會自行更新,並在第二次執行時會運行腳本的實際內容。)

+0

你試過了嗎? – aphoria

+0

@aphoria我問了這個問題,這樣我就不必去嘗試它了,但是StackOverflow已經讓我失望了。所以我必須學習一些東西。 (真可怕!) – PotatoEngineer

回答

1

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

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隨機參數傳遞,但您的里程可能會有所不同 - 或者你可能知道更多的PowerShell比我做,如果你使用Invoke-Expression,則一定要。在任何有空格的參數周圍重新添加引號。)

有一個缺點:如果在未來版本的腳本中刪除了必需的腳本參數,那麼您需要至少運行腳本一次更新之前的不再強制參數允許您刪除參數。

1

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

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 
相關問題