[英]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.