如何循环我的powershell脚本?

时间:2014-09-16 13:31:48

标签: powershell powershell-v2.0 powershell-v3.0

我有一个小脚本来过滤掉过去7天内远程PC的应用程序和系统的错误日志。

Write-Host "Creating Error Log of Remote PC ......."
[System.Threading.Thread]::CurrentThread.CurrentCulture = New-Object "System.Globalization.CultureInfo" "en-US"
$date = get-date
$range = $date.adddays(-7)
$pcname = Read-Host -Prompt "Please Enter PC name"

Get-WinEvent -ComputerName $pcname -FilterHashtable @{LogName="system","application"; Level=1,2; starttime=$range} | 
Select-Object @{label="PC"; expression={"$pcname"}},LogName,levelDisplayName,ProviderName,ID,TimeCreated,message | 
Sort-Object logname | 
Format-Table -AutoSize | 
Out-File C:\Eventlog.txt -width 214748

C:\Eventlog.txt

当它运行时,我会得到一个输入PC名称的提示,问题是当脚本完成后,powershell提示符将返回

PS c:\windows\system32\windowspowershell\v1.0>

如果我想检查另一台PC上的日志,我必须关闭当前的PS窗口并再次运行我的脚本。

如何在首次运行完成后再次显示我的[输入PC名称]提示的循环?

3 个答案:

答案 0 :(得分:3)

您可以将现有代码括在while循环中:

while($true){
   Write-Host "Creating Error Log of Remote PC ......."
   ...
   # rest of the code
   ...
   C:\Eventlog.txt
}

这将无限重复您的代码,或直到您按ctrl+c

答案 1 :(得分:1)

加入do..while循环:

$pcname = Read-Host "Enter PC Name"

do {
    Write-Host "Creating Error Log of Remote PC ......."
    [System.Threading.Thread]::CurrentThread.CurrentCulture = New-Object "System.Globalization.CultureInfo" "en-US"
    $date = get-date
    $range = $date.adddays(-7)
    $pcname = Read-Host -Prompt "Please Enter PC name"

    Get-WinEvent -ComputerName $pcname -FilterHashtable @{LogName="system","application"; Level=1,2; starttime=$range} | 
    Select-Object @{label="PC"; expression={"$pcname"}},LogName,levelDisplayName,ProviderName,ID,TimeCreated,message | 
    Sort-Object logname | 
    Format-Table -AutoSize | 
    Out-File C:\Eventlog.txt -width 214748

    C:\Eventlog.txt
    $pcname = Read-Host "Enter PC Name" 

} while($pcname -match '.+')

while条件检查输入的内容,因此输入空白字符串(只需在输入处按Enter键)将退出脚本

答案 2 :(得分:0)

一种替代方式

# do your stuff

read-host 'press a key to continue'
$file=$myInvocation |select -expand invocationName
start-process -noNewWindow "powershell.exe" "-file $file"

请注意,我不建议使用它,因为它会在每次迭代时消耗资源。

IMO更好的方法是创建一个simple menu来询问用户是否要再次运行该功能。