Перезагрузка ПК с опцией Да / Нет - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь создать скрипт для следующих действий, однако мои навыки кодирования все еще не очень хороши.

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

Я собирался составить расписание заданий для запуска незанятой части, а затем запустить пакетный файл, чтобы открыть опцию да / нет.

Обновление

@ boxdog - ПК не блокируется.

Мне удалось создать скрипт, как показано ниже.

@ECHO OFF
SHUTDOWN /S /F /T 60
SET /P continue="You have been idle for more than 10 minutes.                                                                            Your computer is about to shutdown in 60 seconds do you want to abort (y/n): "
IF %continue% EQU y (
SHUTDOWN /A
)

Не уверен, возможно ли изменить текст синих окон по умолчанию с обратным отсчетом? Или, может быть, кто-то может настроить мой сценарий для лучшей работы?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вот способ получить пользовательский интерфейс для обратного отсчета - отредактируйте XAML, чтобы изменить дизайн окна. Он принимает время обратного отсчета в секундах (по умолчанию 30). Сохраните как скрипт и назовите его так (для обратного отсчета 60 с):

powershell.exe -WindowStyle Hidden -File .\script.ps1 60

Примечание : если вы запускаете в качестве запланированной задачи, диалоговое окно будет отображаться только в том случае, если вошедший в систему пользователь является тем же пользователем, с которым запускается задача.

Param(
    [Parameter()]
    [int]$TimeOut = 30 # Default to 30 second countdown
)

# Load WPF assembly
Add-Type -AssemblyName PresentationFramework

# Define WPF window
$window = [Windows.Markup.XamlReader]::Load(
    [Xml.XmlNodeReader]::new([xml]@'
    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:RebootTimer"
            Title="Idle Reboot Alert" Height="195" Width="400" MaxHeight="195" MaxWidth="400" MinHeight="195" MinWidth="400" ShowInTaskbar="False" Topmost="True" WindowStartupLocation="CenterScreen" WindowStyle="ToolWindow">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock x:Name="AlertText" Grid.Row="0" FontSize="14" TextWrapping="Wrap" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center">
                <Run>You have exceeded the 10 min idle timeout.</Run>
                <LineBreak/>
                <Run>The system will restart in ...</Run>
            </TextBlock>
            <TextBlock x:Name="CountdownText" Grid.Row="1" FontSize="22" FontWeight="Bold" TextWrapping="Wrap" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center" />
            <Button x:Name="CancelButton" Grid.Row="2" Height="35" Width="75">Cancel</Button>
        </Grid>
    </Window>
'@)
)

# Get controls to manipulate
$countdownText = $window.FindName('CountdownText')
$cancelButton = $window.FindName('CancelButton')

# Add event handler to cancel button
$cancelButton.Add_Click({$window.Close()})

$window.Add_SourceInitialized({           
    $script:seconds = $TimeOut

    $countdownText.Text = "$($script:seconds)s"

    $script:timer = New-Object System.Windows.Threading.DispatcherTimer
    $script:timer.Interval = ([TimeSpan]'0:0:1.0') # Fire every second

    $script:timer.Add_Tick.Invoke({   
        $countdownText.Text = "$($script:seconds)s"

        if($script:seconds-- -le 0) {
           Restart-Computer
        }
    })

    $script:timer.Start()
})

# Show the window
$window.ShowDialog() | Out-Null  
0 голосов
/ 16 января 2019

Существует команда choice , если вы хотите использовать командную строку:

echo off
choice /M "You have been idle for more than 10 minutes. Shutdown"
if %ERRORLEVEL% equ 1 (shutdown /S /F /T 60)
if %ERRORLEVEL% equ 2 (echo no was selected)

ERRORLEVEL начинается с 1. Так из примеров, когда вы выполняете choice /?:

choice /C YNC /M "Press Y for Yes, N for No or C for Cancel."

«Y» равно 1, «N» равно 2 и т. Д.

В Powershell проще, но у вас будет сообщение «по умолчанию»:

Stop-Computer -Confirm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...