none
Start-Job передача параметро RRS feed

  • Вопрос

  • Всем добрый день!

    Простой пример

    $uncpath = "\\server1\c$"
    start-job {test-path -path $uncpath}
    

    При этом получаю ошибку: Не удается привязать аргумента к параметру "Path", так как он имеет значение NULL.

    Значение $uncpath не передается в scriptblock start-job, пробовал изменять область переменной global/script, не помогает.

    Как можно передать значение?

    Спасибо.


    MCSE, MCSA:Messaging (2000/2003) MCITP:EMA, MCTS: Exchange 2007
    1 октября 2010 г. 4:40

Ответы

  • Мааалюсенькая поправка: $args лучше избегать даже в скриптблоках, тем более что они вполне позволяют нормально указывать параметры:

    PS D:\Temp> $systemdir = 'C:\Windows\system32'
    PS D:\Temp> $sb = {param($d, $e) dir $d | where {$_.extension -eq $e}}
    PS D:\Temp> $job = Start-Job -ScriptBlock $sb -ArgumentList $systemdir, '.ini'
    PS D:\Temp> Wait-Job $job

    Id              Name            State      HasMoreData     Location             Command
    --              ----            -----      -----------     --------             -------
    1               Job1            Completed  True            localhost            param($d, $e)...


    PS D:\Temp> Receive-Job $job


        Directory: C:\Windows\system32


    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        01.10.2010      2:13     793602 PerfStringBackup.INI
    -a---        11.06.2009      1:01      60124 tcpmon.ini


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа Sergey Babkov 1 октября 2010 г. 10:18
    1 октября 2010 г. 6:54
    Модератор
  • ЕМНИП, аргументы внутрь скриптблока надо передавать при помощи параметра -ArgumentList (аналогично тому, как это делается при передачи параметров в фунцию):

    PS C:\Users\Brian\workspace\myapp> $sb = { "hello world "}
    PS C:\Users\Brian\workspace\myapp> start-job -ArgumentList $sb { $args[0] | gm }

    Id              Name            State      HasMoreData     Location             Command
    --              ----            -----      -----------     --------             -------
    15              Job15           Running    True            localhost             $args[0] | gm

    PS C:\Users\Brian\workspace\myapp> receive-job 15

       TypeName: System.String

    Name             MemberType            Definition
    ----             ----------            ----------
    Clone            Method                System.Object Clone()
    CompareTo        Method                int CompareTo(System.Object value), int CompareTo(string strB)
    Contains         Method                bool Contains(string value)
    CopyTo           Method                System.Void CopyTo(int sourceIndex, char[] destination, int destinationIndex,...
    EndsWith         Method                bool EndsWith(string ...


    blog: http://shss.wordpress.com/
    1 октября 2010 г. 6:39

Все ответы

  • У меня работает эта конструкция. (версия 2)
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    1 октября 2010 г. 6:12
    Модератор
  • ЕМНИП, аргументы внутрь скриптблока надо передавать при помощи параметра -ArgumentList (аналогично тому, как это делается при передачи параметров в фунцию):

    PS C:\Users\Brian\workspace\myapp> $sb = { "hello world "}
    PS C:\Users\Brian\workspace\myapp> start-job -ArgumentList $sb { $args[0] | gm }

    Id              Name            State      HasMoreData     Location             Command
    --              ----            -----      -----------     --------             -------
    15              Job15           Running    True            localhost             $args[0] | gm

    PS C:\Users\Brian\workspace\myapp> receive-job 15

       TypeName: System.String

    Name             MemberType            Definition
    ----             ----------            ----------
    Clone            Method                System.Object Clone()
    CompareTo        Method                int CompareTo(System.Object value), int CompareTo(string strB)
    Contains         Method                bool Contains(string value)
    CopyTo           Method                System.Void CopyTo(int sourceIndex, char[] destination, int destinationIndex,...
    EndsWith         Method                bool EndsWith(string ...


    blog: http://shss.wordpress.com/
    1 октября 2010 г. 6:39
  • Мааалюсенькая поправка: $args лучше избегать даже в скриптблоках, тем более что они вполне позволяют нормально указывать параметры:

    PS D:\Temp> $systemdir = 'C:\Windows\system32'
    PS D:\Temp> $sb = {param($d, $e) dir $d | where {$_.extension -eq $e}}
    PS D:\Temp> $job = Start-Job -ScriptBlock $sb -ArgumentList $systemdir, '.ini'
    PS D:\Temp> Wait-Job $job

    Id              Name            State      HasMoreData     Location             Command
    --              ----            -----      -----------     --------             -------
    1               Job1            Completed  True            localhost            param($d, $e)...


    PS D:\Temp> Receive-Job $job


        Directory: C:\Windows\system32


    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        01.10.2010      2:13     793602 PerfStringBackup.INI
    -a---        11.06.2009      1:01      60124 tcpmon.ini


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа Sergey Babkov 1 октября 2010 г. 10:18
    1 октября 2010 г. 6:54
    Модератор