如何更新脚本中的变量?

How to update variables in script?

内存使用量达到限制后,脚本应重新启动服务并将当前数据和时间保存在文件中。但它不会保存当前时间,并且在服务停止时 if 秒内不会保存 else。它总是在 $data$stat 中显示相同的值。我不确定我在哪里犯了错误。

$proc = 'process name'
$serv = 'service name*'
$ram = 10MB
$inter = 1
$data = Get-Date -format "yyyy/MM/dd HH:mm:ss"
$log = "c:\log.txt"
$stat = Get-Process $proc -EA SilentlyContinue

while ($true) {
    if ((Get-Process $proc -EA SilentlyContinue | Select-Object -Exp ws) -gt $ram) {
        Restart-Service $serv
        Add-Content -path $log -value ($data + "`t" + "Restarting")
        Start-Sleep -m 10000
        if ($stat -ne $null) {
            Add-Content -path $log -value "Working"
        } else {
            Start-Service $serv
            Add-Content -path $log -value ($data + "`t" + "Starting")
        }
    }

    Start-Sleep -s $inter
}

变量赋值中的语句是在赋值时求值的,而不是在使用变量时求值的。要获得后者,您可以将语句定义为脚本块:

$data = { Get-Date -format 'yyyy\/MM\/dd HH:mm:ss' }
$stat = { Get-Process mysqld -ea SilentlyContinue }

在表达式 (()) 或子表达式 ($()) 中使用调用运算符 (&) 稍后在脚本中计算脚本块:

if ((&$stat) -ne $null) {
    Add-Content -Path $log -Value "Working"
} else {
    Start-Service $serv
    Add-Content -Path $log -Value "$(&$data)`tStarting"
}

可能更方便的方法是将操作定义为函数:

function Get-Timestamp { Get-Date -format 'yyyy\/MM\/dd HH:mm:ss' }
function Test-MySQLProcess { [bool](Get-Process mysqld -EA SilentlyContinue) }

并像这样使用它们:

if (Test-MySQLProcess) {
    Add-Content -Path $log -Value "Working"
} else {
    Start-Service $serv
    Add-Content -Path $log -Value "$(Get-Timestamp)`tStarting"
}

附带说明一下,您应该转义日期格式字符串中的正斜杠,否则 Windows 会将它们替换为系统区域设置中配置的任何日期分隔符。