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