Author Posts

July 1, 2015 at 8:21 am

Hey there all,
I am looking to create something that will make remote rebooting faster when I am running installs and updates on some of our boxes.

I have a series of computers that I am routinely servicing. Knowing Windows, there is a lot of restarting involved. I was wondering if I could create a PowerShell script to do the command needed for rebooting(shutdown -i for the Command Line) as quickly and with as little babysitting as possible. All of these computers have 9 character Device IDs, where the last 3 are the only ones that change.

So I'm looking for a script of CMDLet That would have a popup to ask for the last 3 characters, and then reboot the remote computer, maybe saving the task for the session so I could reboot the previous computer even quicker.

It seems like PowerShell should be able to do this, but I haven't done that much with it, so I'm not positive.

Mike Wells

July 1, 2015 at 8:38 am

So, Restart-Computer will restart the computer, but I'm not certain what you mean about "popup to ask for the last 3 characters" or "saving the task for the session."

If you have a series of tasks that you need to complete, and a restart is needed between some of them, then PowerShell Workflow is something to consider. Once a workflow starts, it can remember where it was at, and continue running after restart. Or, look at Desired State Configuration. It can ensure that a computer is placed into a desired state, even if that involves one or more reboots along the way.

July 1, 2015 at 8:59 am

Don, our computer names are all XXXXXXYYY, with they 'Y' part being the only part that changes, so I was looking to create a one click option that would just ask which computer I wanted to reboot, and fill the 'X' part of the name automatically. Putting in only the last 3 characters(The 'Y' part) would save time.

July 1, 2015 at 9:20 am

So... just use Read-Host to prompt for that information, store it in a variable, construct the entire computer name, and use Restart-Computer?

July 1, 2015 at 9:26 am

Don, that's pretty much what I was looking for, an idea where to start and which commands to use. Looks like Read-Host prompts, like you said, then I could combine it with a static value(The X's in my example), and then use Restart computer with the newly assembled Device ID. That sounds like exactly what I was looking for, if I have any issues, I'll poke around the board.

Thank you

July 1, 2015 at 9:35 am

Versus Read-Host, you might consider a function. If your company name was Tech Corp, you would put a TC in your function naming conventions to know they are specific to your company. If you put this function in a Powershell profile, it would be available when you start Powershell. If you start to get multiple functions, consider making it a module and loading that module automatically with your profile.

function Restart-TCComputer {
    param (
        [string]$Prefix = "XXXXXXXXX"
        foreach ($Number in $ComputerNumber) {
            $ComputerName = "{0}{1}" -f $Prefix, $Number
            Write-Verbose ("Restarting computer {0}" -f $ComputerName)
            Restart-Computer -ComputerName $ComputerName -Force -WhatIf

123, 153 | Restart-TCComputer
Restart-TCComputer -ComputerNumber 234

Since a number is mandatory, if you tried to just call Restart-TCComputer, you would be prompted for input:

C:\Windows\System32\WindowsPowerShell\v1.0> Restart-TCComputer
cmdlet Restart-TCComputer at command pipeline position 1
Supply values for the following parameters:
ComputerNumber[0]: 352
ComputerNumber[1]: 321
ComputerNumber[2]: 355

Using a function, you also validate that the numbers are 3 characters using ValidateLength and can use a -Verbose switch if you want visual output to indicate what server is being rebooted.

July 1, 2015 at 9:41 am

Cool, thanks guys, this is great! I learn all of this as I go, I've done a little in PowerShell, and a bunch of cool stuff in VBA for Excel, once I get the starting position like this, I can go through and tweak things, follow up similar examples, and all that. I appreciate the help again!

July 1, 2015 at 11:28 am

This looks like it works pretty well for a single computer, except that I get no prompt to enter data.

I commented out the "-WhatIf" to make it run, and I commented out line 22, as it was asking for computers with 123 and 153 as targets. I changed $Prefix to haev the starting part of the name. With line 23, it has -ComputerNumber 234, and if I change it to the last 3 characters of the one I need to reboot, it works perfectly. I just can't get a prompt of any kind.

I found an example of 'Read-Host' to make it prompt for the number I need, but don't know how to plug that value in.

July 1, 2015 at 12:02 pm

If you don't pass a ComputerNumber to the function, you will be prompted for input because it is Mandatory. So, simply just call the function with no parameters to be prompted: