none
Invoke-Command und Leerzeichen in Pfadangaben RRS feed

  • Frage

  • Hallo,

    ich habe das Problem das ich remote die Version einer Executable abfragen will. Also so etwas hier:

    (Get-ChildItem -File "C:\Pfad1\name vom Executable.exe" | Get-ItemProperty).VersionInfo.ProductVersion

    Das funktioniert leider nicht wenn ich diese Information mittels

    $local:version = Invoke-Command -ComputerName $HostName-ScriptBlock $scrBlck

    Das Problem liegt an dem Leerzeichen im Pfad. bei kompletten Pfaden ohne Whitespace funktioniert das tadellos.

    Hat jemand einen Tipp wie ich den Remote-Aufruf auch mit Whitespaces im Pfad hinbekommen kann? Mir fällt nichts mehr ein.

    Vielen Dank im Voraus und einen schönen Abend.



    Donnerstag, 21. Januar 2016 16:52

Antworten

  • Ich rate einfach mal ins blaue deine Version sieht vermutlich so ähnlich aus? Sprich die Variable wird ausserhalb des Script Blocks definiert:

    $HostName = 'DC2016'
    $File = 'C:\test path\calc.exe'
    $scrBlck = {
        (Get-ChildItem -File $File | Get-ItemProperty).VersionInfo.ProductVersion 
    }
    Invoke-Command -ComputerName $HostName -ScriptBlock $scrBlck

    Falls ja, dann hat dein Problem nichts mit Leerzeichen zu tun, sondern damit das die Variable File innerhalb des Script Block eine andere ist als ausserhalb, Stichwort Scopes/Sichtbarkeit von Variablen. Hierfür bietet Invoke-Command den ArgumentList Parameter. Die übergebenen Variablen wird innerhalb des Script Blocks dann mit $args angesprochen. Bei mehreren übergeben Variablen handelt es sich hierbei um ein Array und die verschiedenen Variablen können dann entsprechend über $args[i] angesprochen werden.

    $HostName = 'DC2016'
    $File = 'C:\test path\calc.exe'
    $scrBlck = {
        (Get-ChildItem -File $args[0] | Get-ItemProperty).VersionInfo.ProductVersion 
    }
    Invoke-Command -ComputerName $HostName -ScriptBlock $scrBlck -ArgumentList $File

    Falls diese Annahme nicht zutrifft, wäre Quellcode (zumindestens die relevanten Teile oder eine vereinfachte Version) und eine eventuelle Fehlermeldung bzw. das eintretende Verhalten hilfreich.

    Gruß Olaf


    Freitag, 22. Januar 2016 18:12

Alle Antworten

  • Hallo,

    wie sieht denn der ScriptBlock aus der Ausgeführt werden soll? Und welche Fehlermeldung erhälst du?

    Bei mir funktioniert es mit folgendem Code einwandfrei:

    $HostName = 'DC2016'
    $scrBlck = {
        (Get-ChildItem -File "C:\test path\calc.exe" | Get-ItemProperty).VersionInfo.ProductVersion 
    }
    Invoke-Command -ComputerName $HostName -ScriptBlock $scrBlck

    Gruß, Olaf


    • Bearbeitet Olaf Reitz Donnerstag, 21. Januar 2016 18:26
    Donnerstag, 21. Januar 2016 18:25
  • Hallo Olaf,

    ich übergebe UNC-Pfade in einer Variable. Diese enthalten Leerzeichen. Also so:

     

    $p = "C:\test path\calc.exe"

    (Get-ChildItem -File p$ | Get-ItemProperty).VersionInfo.ProductVersion 


    Ich brauche eine Funktion die das auf einer Reihe von Servern macht.

    Freitag, 22. Januar 2016 07:44
  • Ich rate einfach mal ins blaue deine Version sieht vermutlich so ähnlich aus? Sprich die Variable wird ausserhalb des Script Blocks definiert:

    $HostName = 'DC2016'
    $File = 'C:\test path\calc.exe'
    $scrBlck = {
        (Get-ChildItem -File $File | Get-ItemProperty).VersionInfo.ProductVersion 
    }
    Invoke-Command -ComputerName $HostName -ScriptBlock $scrBlck

    Falls ja, dann hat dein Problem nichts mit Leerzeichen zu tun, sondern damit das die Variable File innerhalb des Script Block eine andere ist als ausserhalb, Stichwort Scopes/Sichtbarkeit von Variablen. Hierfür bietet Invoke-Command den ArgumentList Parameter. Die übergebenen Variablen wird innerhalb des Script Blocks dann mit $args angesprochen. Bei mehreren übergeben Variablen handelt es sich hierbei um ein Array und die verschiedenen Variablen können dann entsprechend über $args[i] angesprochen werden.

    $HostName = 'DC2016'
    $File = 'C:\test path\calc.exe'
    $scrBlck = {
        (Get-ChildItem -File $args[0] | Get-ItemProperty).VersionInfo.ProductVersion 
    }
    Invoke-Command -ComputerName $HostName -ScriptBlock $scrBlck -ArgumentList $File

    Falls diese Annahme nicht zutrifft, wäre Quellcode (zumindestens die relevanten Teile oder eine vereinfachte Version) und eine eventuelle Fehlermeldung bzw. das eintretende Verhalten hilfreich.

    Gruß Olaf


    Freitag, 22. Januar 2016 18:12