Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Powershell Script, Krijg het niet aan de loop?

Pagina: 1
Acties:

  • bman80
  • Registratie: Maart 2010
  • Laatst online: 14-05 14:38
Dag Tweakers,

Heb een test scriptje gemaakt wat maar niet lopen wil. Het is om localhost te pingen wat ik later wil uitbreiden naar alle computers op netwerk. Je moet ergens beginnen met leerproces.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function Pingen-Lokaal {

# exporteer computernaam naar tekst file met selct name en out file

Get-WmiObject -Class Win32_ComputerSystem | select name | out-File "C:\temp\comp.txt"

# Laat alleen de 3de regel uit tekst bestand filteren wat computernaam is en zet als variable

$Computer = Get-Content C:\temp\comp.txt | Select-Object -Last 3 

# Nu pingen, test-connection met vari $Computer

Test-Connection $Computer }

Pingen-Lokaal

_______________________________________________________________________________________


Test-Connection : Cannot validate argument on parameter 'ComputerName'. The argument is null or empty. Supply an argument th
at is not null or empty and then try the command again.
At line:13 char:16
+ Test-Connection <<<<  $Computer }
    + CategoryInfo          : InvalidData: (:) [Test-Connection], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.TestConnectionCommand


Zo te zien zit de fout zit in $computer variable, zouden daar van die quotation marks moeten staan?
Zodat de waarde groter dan nul wordt? Geen idee hoe je die waarde groter 0 dan krijgt.

Maar als je bv. proef op de som neemt, en geen quotation marks gebruikt voert hij gewoon ping uit??

Visual Basic:
1
2
3
4
5
6
7
8
Test-Connection derkleinepisser
_______________________________________________________________________________________
Source        Destination     IPV4Address      IPV6Address                              Bytes    Time(ms) 
------        -----------     -----------      -----------                              -----    -------- 
DERKLEINEP... derkleinepisser 192.168.1.100    fe80::f003:3976:5eda:eb91%10             32       0        
DERKLEINEP... derkleinepisser 192.168.1.100    fe80::f003:3976:5eda:eb91%10             32       0        
DERKLEINEP... derkleinepisser 192.168.1.100    fe80::f003:3976:5eda:eb91%10             32       0        
DERKLEINEP... derkleinepisser 192.168.1.100    fe80::f003:3976:5eda:eb91%10             32       0        


Heb vervolgens getest of juiste naam wel uit laatste 3de regel komt. En het is zo!

Visual Basic:
1
2
3
4
5
6
Get-Content C:\temp\comp.txt | Select-Object -Last 3

_______________________________________________________________________________________
PS C:\Windows\system32> Get-Content C:\temp\comp.txt | Select-Object -Last 3

DERKLEINEPISSER     



Hoop dat een van u een opl heeft _/-\o_
Bijvoorbaat dank en groet Bman.

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
<vewijderd>

[ Voor 97% gewijzigd door Squ1zZy op 08-11-2020 17:27 ]


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Heb je hier wat aan?

code:
1
2
3
4
5
6
7
8
9
10
11
function Ping-Server {
  $Results =  Get-WmiObject -query "SELECT * FROM Win32_PingStatus WHERE Address = '$Server'"
  if ($Results.StatusCode -eq 0) { 
    write-Host "$Server leeft nog!" }
  else {
    write-Host "$Server is dood!" } }

$Servers = Get-Content "C:\Users\Squ1zZy\Desktop\Servers.txt"

foreach ($Server in $Servers) {
  Ping-Server $Server }

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Je code kan veel eenvoudiger.


PowerShell:
1
2
3
4
5
6
7
8
9
10
Function Ping-Localhost
    {
    # Steek de computer van je WMI query in een object
    $Computer = Get-WmiObject -Class Win32_ComputerSystem
    
    # Voer dan je ping uit op de property "Name" van dat object
    Test-Connection $Computer.Name 
    }

Ping-Localhost


Dit kan trouwens in één lijntje:


PowerShell:
1
Test-Connection (Get-WmiObject -Class Win32_ComputerSystem).Name


Wat betreft een script om er een hoop te pingen heb ik het script van Squ1zZy even herwerkt:


PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ComputerList = "<pad naar een of ander tekstbestand met op elke lijn een computernaam>"
$Computers = @(Get-Content $ComputerList)

Function Ping-Computer($Computer)
    {
    $Results =  Get-WmiObject -Query "SELECT * FROM Win32_PingStatus WHERE Address = '$Computer'"
    If ($Results.StatusCode -EQ 0) 
        { 
        Write-Host "$Computer up!" -ForegroundColor Green
        }
    Else 
        {
        Write-Host "$Computer down!" -ForegroundColor Red
        } 
    }

ForEach ($Computer in $Computers) 
    {
    Ping-Computer $Computer
    }


* YellowOnline heeft zijn code graag leesbaar

[ Voor 58% gewijzigd door YellowOnline op 18-08-2011 10:44 ]


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
YellowOnline: Met het script wat ik heb gemaakt kan je toch ook een "hoop" servers pingen?
Je maakt een txt bestand aan en zet daar alle servers in die je wilt pingen ;)

code:
1
$Servers = Get-Content "C:\Users\Squ1zZy\Desktop\Servers.txt"

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Squ1zZy schreef op donderdag 18 augustus 2011 @ 10:49:
YellowOnline: Met het script wat ik heb gemaakt kan je toch ook een "hoop" servers pingen?
Je maakt een txt bestand aan en zet daar alle servers in die je wilt pingen ;)

code:
1
$Servers = Get-Content "C:\Users\Squ1zZy\Desktop\Servers.txt"
Tsss, mijn code niet goed gelezen dan. Dat is mijn herschreven versie nog steeds zo, alleen gebruik ik een variabele voor dat pad: best practice - stel je voor dat je die bestandsnaam elders wil recycleren. Net zoals de @() overigens, zodat je zeker bent een collectie te krijgen en geen string wanneer er 0 of 1 object uit dat bestand komt. In dit script maakt dat niet uit, maar zoals gezegd: best practice.

Je script werkt dus wel perfect, maar ik vond dat er wat verbeteringen mogelijk waren.

@Hieronder: je begrijpt mijn uitleg blijkbaar niet. DM zonodig.

[ Voor 12% gewijzigd door YellowOnline op 18-08-2011 11:33 ]


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
YellowOnline: Ik zeg toch niet dat jouw script het niet doet? De mijne deed het al en ik zie echt geen verbetringen in het script die jij hebt gecopieerd...

En je maakt een array aan wat onnodig is. Get-Content is meer dan voldoende.

  • bman80
  • Registratie: Maart 2010
  • Laatst online: 14-05 14:38
Squ1zZy schreef op donderdag 18 augustus 2011 @ 09:57:
Het zit het hem in de volgende regel:

code:
1
$Computer = Get-Content C:\temp\comp.txt | Select-Object -Last 3


Hij pakt de laatste 3 regels. Ik vermoed dat 1 van de laatste 3 regels in het text bestand "C:\temp\comp.txt" leeg is ;)
Allereerst bedankt voor de voorbeelden en de moeite! _/-\o_

Ik weet dat methode in voorbeeld sript vere van de juiste is maar vind het erg vreem dat het niet loopt.

Ik dacht eerst ook, dat laaste 3 regels van "C:\temp\comp.txt" geen computernaam zou weergeven. Maar gaat toch goed

Visual Basic:
1
2
3
4
5
6
Get-Content C:\temp\comp.txt | Select-Object -Last 3

_______________________________________________________________________________________
PS C:\Windows\system32> Get-Content C:\temp\comp.txt | Select-Object -Last 3

DERKLEINEPISSER     


Toch raar dat deze computer niet op juiste manier in $Computer vari terecht komt?

  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

Squ1zZy schreef op donderdag 18 augustus 2011 @ 11:17:

En je maakt een array aan wat onnodig is. Get-Content is meer dan voldoende.
Dat ligt er maar net aan.
Een Array kun je sorten en wordt in procesgeheugen geladen.
Als je een txtfile regel voor regel gaat lezen heb je ook nog eens een shitload aan I/Ops. en dat wil je niet als je een remote filesystem benadert.

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


  • Squ1zZy
  • Registratie: April 2011
  • Niet online
code:
1
Get-Content C:\temp\comp.txt | Select-Object -Last 3


Dit laat de laatste 3 regels zien. Werkt en is geen probleem :)

Maar... Wat als 1 van de regels leeg zou zijn? Of een spatie? Dan word het met de code hierboven wel ge-showed, maar kan het script hierboven een error geven omdat de variable $computer leeg is ;)

Open je text bestand eens en kijk eens goed of er geen spaties achter een regel staan. Of misschien dat er lege regels zijn :)

alt-92: Klopt, maar je moet het text betand sowieso uitlezen. En in dit geval is het geen 10mb txt bestand anders heb je een aardige enterprise ;)
Pagina: 1