gpt4 book ai didi

powershell - 如何在运行之前更新当前脚本?

转载 作者:行者123 更新时间:2023-12-04 18:44:08 27 4
gpt4 key购买 nike

我们有一些 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 更幸运地传递随机参数,但您的里程可能会有所不同 - 或者您可能比我更了解 PowerShell。如果您使用 Invoke-Expression ,那么确保在其中包含空格的任何参数周围重新添加引号。)

有一个缺点:如果在脚本的 future 版本中删除了必需的脚本参数,则您需要至少使用 no-longer-mandatory 参数运行该脚本一次,然后它才会自行更新以允许您删除该参数。

关于powershell - 如何在运行之前更新当前脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18007206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com