none
seltsame Ablauffolge mit -like RRS feed

  • Frage

  • Hallo,

    ich entwickle schon einige Jahre mit VB(A), PL/SQL, JScript, VB-Script und Batch. Nun fange ich an mich mit PowerShell zu beschäftigen. Ich habe nun eine Funktion erstellt, mit Werte aus einer INI-Datei zurückliefern soll:

    function Get-ConfigINIValue([string]$sINIFilename, [string]$sSection, [string]$sKey)
        {
        [string]$sPatternComment = ";*"
        [string]$sPatternSectionElse = "[*]*"
        [string]$sPatternSectionThis = "[" + $sSection + "]*"
        [string]$sPatternKeyThis = $sKey + "=*"
    
        [boolean]$InSection = $false
        
        Write-Output "- IN-Parameters ------" 
        Write-Output "INIFile: $sINIFilename"
        Write-Output "Section: $sSection"
        Write-Output "Key    : $sKey"
        Write-Output "----------------------" 
        
        Write-Output "- Pattern ------------" 
        Write-Output "Comment: $sPatternComment"
        Write-Output "SecElse: $sPatternSectionElse"
        Write-Output "SecThis: $sPatternSectionThis"
        Write-Output "KeyThis: $sPatternKeyThis"
        Write-Output "----------------------" 
    
        $sContent = Get-Content $sINIFilename
        $sRetVal = "not found" # NUR ZU TESTZWECKEN
        ForEach ($s in $sContent)
            {
            Write-Output "$s"
            
            If ($s -like $sPatternComment)
                {
                # Kommentare ignorieren
                Write-Output "... something to ignore"
                }
            ElseIf ($s -like $sPatternSectionThis)
                {
                Write-Output "... found my section"
                $InSection = $true
                }
            ElseIf ($s -like $sPatternSectionElse)
                {
                Write-Output "... found other section"
                $InSection = $false
                }
            ElseIf ($InSection -eq $true)
                {
                Write-Output "... check the key"
                If (($s -like $sPatternKeyThis))
                    {
                    Write-Output "... yes, it is"
                    $sRetVal = $s.SubString($s.IndexOf("=") + 1)
                    }
                }
            Else
                {
                Write-Output "... nothing to do???"
                }       
    
            }
        return $sRetVal
        }
    
    

    Leider verhält sich das If-Konstrukt nicht so, wie ich es möchte. Es wird immer eine Element zu spät in eine If-Block verzweigt?!? Zur Veranschaulichung folgendes Beispiel:

    Inhalt INI-Datei:

    ; abweichender DB-Standort
    [Data Source]
    SourceDir=\\Test\my\location
    [End]

    Ausgabe des Scripts:

    - IN-Parameters ------
    INIFile: C:\Dokumente und Einstellungen\Ifm001\Desktop\Test_Reg.ini
    Section: Data Source
    Key    : SourceDir
    ----------------------
    - Pattern ------------
    Comment: ;*
    SecElse: [*]*
    SecThis: [Data Source]*
    KeyThis: SourceDir=*
    ----------------------
    ; abweichender DB-Standort
    ... something to ignore
    [Data Source]
    ... nothing to do???
    SourceDir=\\Test\my\location
    ... found my section
    [End]
    ... check the key

    Erwartet hätte ich:

    ; abweichender DB-Standort
    ... something to ignore
    [Data Source]
    ... found my section
    SourceDir=\\Test\my\location
    ... check the key
    ... yes, it is
    [End]
    ... found other section

    Findet wer von hier meinen Denkfehler?

    Vielen Dank im Vorraus ...


    • Bearbeitet Ifm001 Mittwoch, 13. August 2014 11:58 Stichwort "Like" in den Titel
    Dienstag, 12. August 2014 08:38

Antworten

  • Hallo,

    ich glaube dein Problem mit [Data Source] usw. sind die Klammern, das wird z.B.: geprueft in der deiner Funktion.

    '[Data Source]' -like '[Data Source]*'

    Das ergibt aber ein FALSE weil die [] als "Pattern Parameter" interpretiert werden, so sollte es gehen.

    '[Data Source]' -like '`[Data Source`]*'

    Du musst also die Pattern in denen du [] benutzt entsprechend anpassen.

    Beste Gruesse
    brima

    • Als Antwort markiert Ifm001 Dienstag, 12. August 2014 10:20
    Dienstag, 12. August 2014 09:25

Alle Antworten

  • Hallo,

    ich glaube dein Problem mit [Data Source] usw. sind die Klammern, das wird z.B.: geprueft in der deiner Funktion.

    '[Data Source]' -like '[Data Source]*'

    Das ergibt aber ein FALSE weil die [] als "Pattern Parameter" interpretiert werden, so sollte es gehen.

    '[Data Source]' -like '`[Data Source`]*'

    Du musst also die Pattern in denen du [] benutzt entsprechend anpassen.

    Beste Gruesse
    brima

    • Als Antwort markiert Ifm001 Dienstag, 12. August 2014 10:20
    Dienstag, 12. August 2014 09:25
  • Hallo,

    so habe deinen Code mal angepasst.

    function Get-ConfigINIValue ([string]$sINIFilename, [string]$sSection, [string]$sKey) {
    	[string]$sPatternComment = ";*"
    
    	[string]$sPatternSectionThis = "$sSection"
    	[string]$sPatternKeyThis = $sKey + "=*"
    	[boolean]$InSection = $false
    
    	Write-Output "- IN-Parameters ------" 
    	Write-Output "INIFile: $sINIFilename"
    	Write-Output "Section: $sSection"
    	Write-Output "Key    : $sKey"
    	Write-Output "----------------------" 
    
    	Write-Output "- Pattern ------------" 
    	Write-Output "Comment: $sPatternComment"
    	Write-Output "SecElse: $sPatternSectionElse"
    	Write-Output "SecThis: $sPatternSectionThis"
    	Write-Output "KeyThis: $sPatternKeyThis"
    	Write-Output "----------------------" 
    
    	$sContent = Get-Content $sINIFilename	
    	$sRetVal = "not found" # NUR ZU TESTZWECKEN
    	ForEach ($s in $sContent) {
    		Write-Output "$s"
    		If ($s -like $sPatternComment) {
    			# Kommentare ignorieren
    			Write-Output "... something to ignore"
    		}
    		ElseIf ($s -like "``[$sPatternSectionThis``]*") {
    			Write-Output "... found my section"
    			$InSection = $true
    		}
    		ElseIf ($s -like "``[*``]*") {
    			Write-Output "... found other section"
    			$InSection = $false
    		}
    		ElseIf ($InSection -eq $true) {
    			Write-Output "... check the key"
    			If (($s -like $sPatternKeyThis)) {
    				Write-Output "... yes, it is"
    				$sRetVal = $s.SubString($s.IndexOf("=") + 1)
    			}
    		}
    		Else {
    			Write-Output "... nothing to do???"
    		}        
    	}
    	return $sRetVal
    }
    
    Get-ConfigINIValue -sINIFilename '.\Test.ini' -sSection 'Data Source' -sKey 'SourceDir'
    
    
    


    Dienstag, 12. August 2014 10:17
  • Oh man ... an sowas in der Art hatte ich auch schon gedacht, mich dann aber auf die Dokumentation verlassen:

    PS C:\Dokumente und Einstellungen\Moch\Desktop> get-help about_Comparison_Operators -detailed
    THEMA
        about_Comparison_Operators

    KURZBESCHREIBUNG
        Beschreibt die Operatoren zum Vergleichen von Werten in Windows
        PowerShell.

    [...]

       -like
          Beschreibung: Übereinstimmung mit dem Platzhalterzeichen (*).
          Beispiel:

              C:\PS> "Windows PowerShell" -like "*shell"
              True

    [...]

    Mit folgender Pattern-Definition geht's:

        [string]$sPatternComment = ";*"
        [string]$sPatternSectionElse = "[[]*[]]*"
        [string]$sPatternSectionThis = "[[]" + $sSection + "[]]*"
        [string]$sPatternKeyThis = $sKey + "=*"

    Danke dir für deine schnelle Hilfe.

    • Bearbeitet Ifm001 Dienstag, 12. August 2014 10:23
    Dienstag, 12. August 2014 10:20
  • Antwort-Haken ist schon da, ich schreib aber trotzdem noch was hierzu:

    Such doch mal in der Script Gallery bei MS nach "INI file". Da hat sich Oliver Lipkau die Mühe gemacht, eine INI auszulesen und das Ergebnis als HashTable zu speichern. Auch eine Schreib-INI-Datei-Funktion gibt es.

    Ich nutze die Lese-Funktion selbst, klappt sehr gut.

    Walter

    Dienstag, 19. August 2014 14:40