Asked by:
Powershell Scripts: Check which computers are turned on

Question
-
Hello to all,
I need to check which computers are still on, within my farm.
I used this script:$computers = "pcxx1","pcxx2","pcxx3","pcxx4","pcxx5","pcxx6"
Foreach($c in $computers) {
IF (Test-Connection -BufferSize 32 -Count 1 -ComputerName $c -Quiet) {
Write-Host "The remote computer " $c " is Online"
} Else {
Write-Host "The remote computer " $c " is Offline"
}}RESULT:
The remote computer pcxx1 is Online
The remote computer pcxx2 is Online
The remote computer pcxx3 is Offline
The remote computer pcxx4 is Online
The remote computer pcxx5 is Offline
The remote computer pcxx6 is OfflineThat's how it works.
I must, however, import a .csv file containing all the computers and users assigned to them. With the "import-csv" command
The result is wrong .. all are offline:
The remote computer pcxx1 is offline
The remote computer pcxx2 is offline
The remote computer pcxx3 is offline
The remote computer pcxx4 is offline
The remote computer pcxx5 is offline
The remote computer pcxx6 is offline
Where am I wrong?
I also need to export the result to a .xml file
Target is that, for the truth, only see computers turned on .. of those offline I do not care much about it ..
Thanks for your helpWednesday, July 26, 2017 12:44 PM
All replies
-
Could you post all of the script and the csv headers ?(or columns you have)Wednesday, July 26, 2017 1:05 PM
-
Use the Test-Connection cmdlet to send a ping (icmp packet) to the remote computer.
If you specify the –Quiet parameter, it returns only True or False.
Test-Connection -BufferSize 32 -Count 1 -ComputerName 192.168.0.41 -QuietLearn how to use Windows PowerShell to query Active Directory for computers, ping for status, and display:
https://blogs.technet.microsoft.com/heyscriptingguy/2011/11/19/query-ad-for-computers-and-use-ping-to-determine-status/Get computers ping status, IP, OS version, sp version, uptime and last boot gui: https://gallery.technet.microsoft.com/scriptcenter/Display-computers-status-c8ff289d
Is this thing on? Using the PowerShell Test-Connection CmdLet
Powershell script to detect when PC is turned on & Connected to domain
Hope this helps!Solution for Active Directory auditing, monitoring and management.
Thursday, July 27, 2017 7:15 AM -
I'm not a fan of those cmdlets. Or this code formatting.
Function get-ping {
Param (
[parameter(ValueFromPipeline)]
[string]$hostname
)
Begin {
$ping = New-Object System.Net.Networkinformation.ping
$timeout = 500
}
Process {
$ping.Send($hostname, $timeout) | select @{name='hostname'
expression={$hostname}},address,status,roundtriptime
}
}
PS C:\> echo c011,c012,c013 | get-ping
hostname Address Status RoundtripTime
-------- ------- ------ -------------
c011 198.18.188.10 Success 1
c012 TimedOut 0
c013 TimedOut 0- Edited by JS2010 Friday, July 28, 2017 3:35 AM
Thursday, July 27, 2017 7:59 PM -
I think I might know what is happening. The command
Test-Connection -BufferSize 32 -Count 1 -ComputerName servername -Quiet
can only have two outputs (because of the -quiet), True, or False
The if statement is saying "if there is a result, do this". There is ALWAYS a result, it is true or false. You should probably change it to something like
$variable = Test-Connection -BufferSize 32 -Count 1 -ComputerName $c -Quiet
if($variable -eq "true")
{Write-Host "The remote computer " $c " is Online"}
else
{Write-Host "The remote computer " $c " is offline"}
Thursday, July 27, 2017 8:59 PM -
All commands that return a Boolean are designed to be tested with an "if" or any logical expression. That is how programming in any language works.
This construct:
$variable = Test-Connection -BufferSize 32 -Count 1 -ComputerName $c -Quiet
if($variable -eq "true")is redundant and is prone to errors when the concept is used in other contexts. We never need to test a Boolean against true/false.
if(Test-Connection -BufferSize 32 -Count 1 -ComputerName $c -Quiet){ ...
is how the "Test" CmdLets are designed to work.
The issue here is likely due to the CSV file and how it is being used. Since we do not have that code it is not possible to speculate on what is happening.
\_(ツ)_/
- Edited by jrv Thursday, July 27, 2017 9:15 PM
Thursday, July 27, 2017 9:13 PM -
All commands that return a Boolean are designed to be tested with an "if" or any logical expression. That is how programming in any language works.
This construct:
$variable = Test-Connection -BufferSize 32 -Count 1 -ComputerName $c -Quiet
if($variable -eq "true")is redundant and is prone to errors when the concept is used in other contexts. We never need to test a Boolean against true/false.
if(Test-Connection -BufferSize 32 -Count 1 -ComputerName $c -Quiet){ ...
is how the "Test" CmdLets are designed to work.
The issue here is likely due to the CSV file and how it is being used. Since we do not have that code it is not possible to speculate on what is happening.
\_(ツ)_/
Friday, July 28, 2017 5:00 PM -
I recommend this: https://www.amazon.com/Windows-PowerShell-TFM-Jason-Helmick/dp/0982131461
Also search amazon for books. There are many excellent ones. I suggest reading and doing all examples and exercises in at least two of them up to at least the middle chapters. You will become a guru overnight.
\_(ツ)_/
- Proposed as answer by frank_songMicrosoft contingent staff Friday, August 11, 2017 4:24 AM
Friday, July 28, 2017 5:06 PM -
Hi,
Just checking in to see if the information provided was helpful. Please let us know if you would like further assistance.
Best Regards,
FrankPlease remember to mark the replies as answers if they help and unmark them if they provide no help.
If you have feedback for TechNet Subscriber Support, contact tnmff@microsoft.com.Friday, August 11, 2017 4:24 AM