Powershell - 在运行之前检查脚本的更新

时间:2013-04-03 20:30:13

标签: powershell powershell-v3.0

我想知道是否有人知道在运行之前让PowerShell脚本检查自身更新的方法。

我有一个脚本,我将调度到多台计算机,并且不希望每次更改脚本时都必须将其重新部署到每台计算机。我想让它检查某个位置,看看是否有更新版本的自身(并在需要时自行更新)。

我似乎无法想办法。如果有人可以提供帮助,请告诉我。感谢。

2 个答案:

答案 0 :(得分:3)

好吧,有一种方法可能是创建一个运行实际脚本的简单批处理文件,该批处理文件中的第一行可能是检查更新文件夹中是否存在ps1。如果有,可以先将其复制,然后启动PowerShell脚本

EG。每当有更新时,您都会将“Mypowershellscript.ps1”脚本放在c:\temp\update\ folder

让我们假设您的脚本将从

运行
c:\temp\myscriptfolder\

然后您可以像这样创建批处理文件

if NOT exist C:\temp\update\mypowershelscript.ps1 goto :end

copy /Y c:\temp\update\MyPowerShellScript.ps1 c:\temp\MyScriptFolder\

:END

%systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe -nologo -noprofile -file "c:\temp\myscriptfolder\mypowershellscript.ps1"

答案 1 :(得分:0)

这是我放在一起的功能。将它传递给可能包含较新版本的文件的路径。这将更新自身,然后使用传递给原始脚本的任何参数重新运行。在此过程的早期执行此操作,其他功能结果将丢失。我通常检查网络是否已启动,我可以看到持有新文件的共享,然后运行:

 function Update-Myself
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true,
                   Position = 0)]
        [string]$SourcePath
    )
    #Check that the file we're comparing against 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"