none
Powershell ein "$" Zeichen als Parameter übergeben RRS feed

  • Frage

  • Hi, ich übergebe an mein Sevice Prüfskript die Dienste die ich prüfen möchte.

    Nun gibt es leider Dienste, die lustigste Sachen in ihren Servicenamen packen.

    Bsp.: MSSQL$DATEV_DBENGINE,SQLAgent$DATEV_DBENGINE

    Wenn ich diese nun übergebe, erkennt PS hierrin Variablen.

    Habe einmal den Teil des Skriptes mit angehongen:

    $logfile="C:\service_start.log"
    $server=$args[0]
    $services=$args[1].split(",")
    
    $result="OK - Service Checks"
    $error="0"
    $runningservices=""
    $runningservices=Get-Service -ComputerName $server
    
    foreach ($i in $services)
    {
    if ($runningservices.Name.ToLower() -match $i.ToLower())
    {
    
    $position=[array]::indexof($runningservices.Name.ToLower(),$i.ToLower())
    
    $chanelname=$runningservices[$position].Name
    $chaneldispname=$runningservices[$position].DisplayName
    
    if ($chanelname) {} else {$chanelname=$i}
    
    
    if ($runningservices[$position].Status -like "Running") 
    {
    echo "<value>1</value>"
    
    }
    
    else {
    echo $i
    echo "<value>0</value>"
    $error="1"
    try {
    #
    $unixtime=(Get-Date -UFormat %s) -Replace("[,\.]\d*", "")
    echo "" >>$logfile
    $unixtime24hago=$unixtime-86400
    
    $servicestartlog=Get-Content $logfile
    
    foreach ($i in $servicestartlog)
    {
    $logvalues=$i.split(":")
    #$logvalues
    #echo $logvalues[0] $logvalues[2]
    
    if (($logvalues[0] -eq $server) -and ($logvalues[1] -eq $chanelname) -or ($logvalues[0] -eq "" ) )
    {
    
    #echo $logvalues[2]
    if ($logvalues[2] -gt $unixtime24hago)
    {
    $mail=$mail+"||"+$i
    $sendmail=$sendmail+1
    }
    else{
    $return=Get-Service $chanelname -ComputerName $server | start-service
    echo $server":"$chanelname":"$unixtime >>$logfile
    }
    }
    }
    if ($sendmail -eq 1) {
    Send-MailMessage -To $emailTo -Subject $subject -Body $mail -SmtpServer $smtpServer -From $emailFrom -Priority $priority 
    }
    }
    catch
    {
    #echo "fehler"
    #echo "returncode:" $return
    }
    
    
    $problem="$chanelname,$problem"
    $result="Problem with Service: $problem"
    }
    
    }
    
    }
    
    if ($error -eq "0")
    {
    #write-host 0
    #write-host "End: ExitCode 0"
    exit 0
    }
    else { 
    #write-host "End: ExitCode 1"
    echo "<error>1</error>"
    exit 1}
    

    Mfg. Chris

    Mittwoch, 24. Juli 2013 08:42

Antworten

  • Hi Chris,

    einfach den String in einfach Anfürhungsstiche setzen. Dann wir kein Parsing auf Variablen vorgenommen :-)

    Bsp. 'MSSQL$DATEV_DBENGINE,SQLAgent$DATEV_DBENGINE' anstatt "MSSQL$DATEV_DBENGINE,SQLAgent$DATEV_DBENGINE"

    Gruß Malte

    Mittwoch, 24. Juli 2013 08:58
  • 1. du brauchst in der PowerShell nicht ToLower() da PowerShell nicht auf gross und kleinschreibung achtet!
    HaLlo -eq HAlLO ergibt $True !

    2. der Operator -Match benutzt Regular Expressions (RegEx) zum vergleichen. Regular Expressions (RegEx) ist eine eigenen Sprache!  hier können Probleme mit Sonderzeichen aufteten UND RegEx verbraucht mehr rechenzeit!

    .NET (PowerShell) Regular Expressions :
    http://msdn.microsoft.com/de-de/library/vstudio/hs600312.aspx

    Einige Services haben auch ein + Zeichen im Namen dieses ist ganauso wie das  $ Zeichen ein Sonderzeichen in Regular RegEx !!

    http://msdn.microsoft.com/de-de/library/vstudio/az24scfc.aspx

    Deshalb fällt der -match Operator auf die Nase!

    Nimm da lieber die Operatoren -Like der kann mit Jokerzeichen (* und ?) arbeiten oder -eq !

    Da ich die gesuchten Services nicht habe, habe ich den code anders getestet.

    Ich habe mir folgendes funktionierendes Script abgespeichert; C:\temp\Test.ps1 :

    $services = $Args[0].split(",")
    #$services
    foreach ($i in $services) {
        
        if ('SQLAgent$DATEV_DBENGINE' -Like "*$i*") {
          'SQLAgent$DATEV_DBENGINE Service gefunden!'
        }
    
        if ('MSSQL$DATEV_DBENGINE' -Like "*$i*") {
          'MSSQL$DATEV_DBENGINE Service gefunden!'
        }
    }




    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 25. Juli 2013 05:43

Alle Antworten

  • Hi Chris,

    einfach den String in einfach Anfürhungsstiche setzen. Dann wir kein Parsing auf Variablen vorgenommen :-)

    Bsp. 'MSSQL$DATEV_DBENGINE,SQLAgent$DATEV_DBENGINE' anstatt "MSSQL$DATEV_DBENGINE,SQLAgent$DATEV_DBENGINE"

    Gruß Malte

    Mittwoch, 24. Juli 2013 08:58
  • Funktioniert nicht.

    folgendes schon probiert.

    skript.ps1 host 'MSSQL$DATEV_DBENGINE,SQLAgent$DATEV_DBENGINE'

    skript.ps1 host "MSSQL$DATEV_DBENGINE,SQLAgent$DATEV_DBENGINE"

    skript.ps1 host "MSSQL$DATEV_DBENGINE","SQLAgent$DATEV_DBENGINE"

    skript.ps1 host 'MSSQL$DATEV_DBENGINE','SQLAgent$DATEV_DBENGINE'

    Das funktioniert, wenn im DienstName ein Leerzeichen sich befindet, aber nicht bei einem "$" Zeichen.

    Powershell scheint hier immer eine Variable erkennen zu wollen.

    Mfg. Chris

    Mittwoch, 24. Juli 2013 09:10
  • Funktioniert!

    Ich habe mir folgendes Script abgespeichert; C:\temp\Test.ps1 :

    $services = $Args[0].split(",")
    foreach ($i in $services) {
        $i
    }

    Dieses rufe ich auf (PowerShell 2.0 und 3.0)

    C:\temp\Test.ps1 'MSSQL$DATEV_DBENGINE,SQLAgent$DATEV_DBENGINE'

    Ergebnis:

    MSSQL$DATEV_DBENGINE
    SQLAgent$DATEV_DBENGINE

    Dein Fehler muss tiefer in deinem Script liegen, oder in der Abfrage!?:

    $runningservices=Get-Service -ComputerName $server


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Donnerstag, 25. Juli 2013 05:05 fgdfddgfg
    Mittwoch, 24. Juli 2013 10:03
  • Stimmt, übergeben bekommt er es richtig, jedoch kann er es dann nicht finden.

    An dieser Stelle steigt das Skript dann aus:

    if ($runningservices.Name.ToLower() -match $i.ToLower())

    Mittwoch, 24. Juli 2013 21:22
  • 1. du brauchst in der PowerShell nicht ToLower() da PowerShell nicht auf gross und kleinschreibung achtet!
    HaLlo -eq HAlLO ergibt $True !

    2. der Operator -Match benutzt Regular Expressions (RegEx) zum vergleichen. Regular Expressions (RegEx) ist eine eigenen Sprache!  hier können Probleme mit Sonderzeichen aufteten UND RegEx verbraucht mehr rechenzeit!

    .NET (PowerShell) Regular Expressions :
    http://msdn.microsoft.com/de-de/library/vstudio/hs600312.aspx

    Einige Services haben auch ein + Zeichen im Namen dieses ist ganauso wie das  $ Zeichen ein Sonderzeichen in Regular RegEx !!

    http://msdn.microsoft.com/de-de/library/vstudio/az24scfc.aspx

    Deshalb fällt der -match Operator auf die Nase!

    Nimm da lieber die Operatoren -Like der kann mit Jokerzeichen (* und ?) arbeiten oder -eq !

    Da ich die gesuchten Services nicht habe, habe ich den code anders getestet.

    Ich habe mir folgendes funktionierendes Script abgespeichert; C:\temp\Test.ps1 :

    $services = $Args[0].split(",")
    #$services
    foreach ($i in $services) {
        
        if ('SQLAgent$DATEV_DBENGINE' -Like "*$i*") {
          'SQLAgent$DATEV_DBENGINE Service gefunden!'
        }
    
        if ('MSSQL$DATEV_DBENGINE' -Like "*$i*") {
          'MSSQL$DATEV_DBENGINE Service gefunden!'
        }
    }




    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 25. Juli 2013 05:43