2014-09-16 3 views
0

У меня есть небольшой скрипт для фильтрации журнала ошибок для приложения и системы для удаленного ПК за последние 7 дней.Как закодировать мой скрипт powershell?

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 

Когда он работает, я получу приглашение ввести имя компьютера, Дело в том, что когда сценарий закончен, PowerShell запрос будет вернуться к

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

Если я хочу, чтобы проверить журналы на другому ПК я должен закрыть текущее окно PS и снова запустить свой сценарий.

Как я могу сделать цикл, чтобы он снова показывал мое приглашение [Enter PC name] после завершения первого запуска?

ответ

3

Вы могли бы вложить существующий код в while цикле:

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

Это будет повторять код до бесконечности или пока вы нажмете ctrl+c.

+0

Я люблю этот путь, просто! Спасибо. –

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 на входе) будет выход из сценария

1

в заселение вместо себя иного пути

# do your stuff 

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

Обратите внимание, что я бы не рекомендовал использовать thi так как это приведет к новому процессу и потребляет ресурс на каждой итерации.

IMO лучшим способом было бы создать simple menu, чтобы спросить пользователя, хочет ли он запустить функцию в другое время.

+0

Это новая идея. попробует. –

Смежные вопросы