Создание пакетных заданий в PowerShell

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
5
задан unclemeat 16 April 2015 в 00:03
поделиться

3 ответа

Помните, что PowerShell может получить доступ к объектам .NET. Начинать-сон, как предложил Blair Conrad может быть заменен вызовом к WaitForInputIdle серверного процесса, таким образом, Вы знаете, когда сервер готов прежде, чем запустить клиент.

$sp = get-process server-application
$sp.WaitForInputIdle()

Вы могли также использовать Процесс. Начните запускаться, процесс и иметь его возвращают точный Процесс. Затем Вам не нужен получать-процесс.

$sp = [diagnostics.process]::start("server-application", "params")
$sp.WaitForInputIdle()
$cp = [diagnostics.process]::start("client-application", "params")
5
ответ дан 14 December 2019 в 13:52
поделиться

@Lars предложенный Truijens

Помните, что PowerShell может получить доступ к объектам .NET. Начинать-сон, как предложил Blair Conrad может быть заменен вызовом к WaitForInputIdle серверного процесса, таким образом, Вы знаете, когда сервер готов прежде, чем запустить клиент.

Это более изящно, чем сон для фиксированного (или предоставленный через параметр) количество времени. Однако WaitForInputIdle

применяется только к процессам с пользовательским интерфейсом и, поэтому, цикл сообщения.

таким образом, это не может работать, в зависимости от характеристик серверного приложения запуска. Однако как Lars указал мне, вопрос упомянул оконное приложение (который я пропустил, когда я считал вопрос), таким образом, его решение является, вероятно, лучшим.

1
ответ дан 14 December 2019 в 13:52
поделиться

Для ожидания 10 секунд между запуском приложений попробовать

launch-server-application serverparam1 serverparam2 ...
Start-Sleep -s 10
launch-client-application clientparam1 clientparam2 clientparam3 ...

Если Вы хотите создать сценарий и передать аргументы в, создайте файл, названный runlinkedapps.ps1 (или безотносительно) с этим содержанием:

launch-server-application $args[0] $args[1]
Start-Sleep -s 10
launch-client-application $args[2] $args[3] $args[4]

Или однако Вы принимаете решение распределить сервер и клиентские параметры на строке, которую Вы используете для выполнения runlinkedapps.ps1. Если Вы хотите, Вы могли бы даже передать в задержке сюда вместо жесткого кодирования 10.

Помните, Ваш .ps1 файл должен быть на Вашем Пути, или необходимо будет указать его местоположение при выполнении его. (О, и я предположил, что серверное приложение запуска и клиентское приложение запуска находятся на Вашем Пути - в противном случае необходимо будет указать полный путь им также.)

0
ответ дан 14 December 2019 в 13:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: