@genbachae

Почему Power Shell не видит функцию?

Запускаю код:

[xml]$inputs = New-Object system.Xml.XmlDocument
$inputs.Load('.\inputs.xml') 

$matrix = New-Object System.Collections.ArrayList

$hostname = 'ya.ru'

$r = Start-Job {getMyPing $hostname}
[int]$id = $r.Id
$matrix.Add(($id))
$matrix

Start-Sleep -Sec 12

Get-Job
Receive-Job $id


function global:getMyPing($hostname) {
    [string]$resPing = ''
    if (Test-Connection $hostname -Quiet)
	{
		$resPing += "Ping to " + $hostname + " success`r`n"      #   формируем содержимое файла report.txt
		$port = $server.port
		$sock = new-object System.Net.Sockets.Socket -ArgumentList $([System.Net.Sockets.AddressFamily]::InterNetwork),$([System.Net.Sockets.SocketType]::Stream),$([System.Net.Sockets.ProtocolType]::Tcp)
			try {
				$sock.Connect($hostname,$Port) | Out-Null        #   попытка соединения
				$resPing += "port " + $port + " connect success`r`n"
				$resPing += "`r`n"
				$sock.Close()
				}
			catch {
			$resPing += "port " + $port + " connect fail`r`n"
			$resPing += "`r`n"
			} 
	}
	else
	{
		$resPing += "Ping to " + $hostname + " fail`r`n"         #   формируем содержимое файла report.txt
	}
    $events = $resPing
    return $events
}

на строке:

Receive-Job $id

выскакивает ошибка:

Имя "getMyPing" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку.

Вопрос: что, в коде, я делаю не так?
5eb9ec82be550642150927.png
  • Вопрос задан
  • 723 просмотра
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
Всё по той же причине - Job - это отдельный процесс, он не знает о ваших функциях.
Возможны три варианта:
1. функцию надо разместить прямо внутри вашего скриптблока
2. функцию надо выносить в модуль
3. использовать альтернативу - PoshRSJob, которому можно указать какие функции импортировать
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@azarij
В меру опытный никто
у меня вот так получилось заставить это работать:

$hostname = "ya.ru"

$funcs = {function myfunction($hostname){
    Test-NetConnection $hostname
    }
}

Start-Job -InitializationScript $funcs -ScriptBlock {myfunction $using:hostname}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 09:44
20000 руб./за проект
29 мар. 2024, в 09:31
1000 руб./в час
29 мар. 2024, в 07:55
15000 руб./за проект