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会用系统的区域设置中配置的任何日期分隔符来替换它们