Powershell 如何更新脚本中的变量?

Powershell 如何更新脚本中的变量?,powershell,powershell-4.0,Powershell,Powershell 4.0,在内存使用达到限制后,脚本应重新启动服务并将当前数据和时间保存在文件中。但它不会保存当前时间,如果服务停止,则不会在第二秒内保存。它总是在$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-

在内存使用达到限制后,脚本应重新启动服务并将当前数据和时间保存在文件中。但它不会保存当前时间,如果服务停止,则不会在第二秒内保存。它总是在
$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会用系统的区域设置中配置的任何日期分隔符来替换它们