Ограничение одного экземпляра сценария PS, когда все параметры совпадают - PullRequest
0 голосов
/ 30 августа 2018

Я запускаю скрипт со следующими параметрами:

test.ps1 -parm1 abc1 -parm2 abc2  -parm3 abc3

Я выполняю сценарий удаленно из другого приложения и хочу запустить только один экземпляр сценария, если параметры совпадают.

Другими словами, если все параметры совпадают, то в любой момент должен быть запущен только один экземпляр скрипта.

Я использую следующую логику, но она возвращает ноль

Get-WmiObject Win32_Process -Filter "Name='powershell.exe' AND CommandLine LIKE '%test.ps1%'"

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я предполагаю, что вы хотите предотвратить одновременное выполнение нескольких экземпляров скрипта на 1 хосте.

В этом случае ваш скрипт создаст так называемый «файл блокировки» (просто какой-нибудь текстовый файл в указанном вами месте по вашему выбору)

В начале вашего скрипта проверьте, существует ли файл (если он есть, другой экземпляр работает; выручите!) если он не существует; создайте файл блокировки, сделайте свой сценарий и в конце не забудьте удалить файл блокировки (если сценарию не разрешено запускаться более одного раза на этом компьютере)

Не стесняйтесь добавлять дополнительную информацию в файл блокировки (например, используемые параметры, идентификатор процесса), чтобы сделать этот файл еще более универсальным.

0 голосов
/ 30 августа 2018

Если вы запустили это ...

WmiObject Win32_Process -Filter "Name='powershell.exe' AND CommandLine LIKE '%test.ps1%'"

… и он ничего не возвратил, значит, он не работает, не запускается и не закрывается.

Я только что попробовал то, что вы опубликовали, и вышеизложенное тянет за линию процесса, как ожидалось.

# begin test.ps1 script

Param
(
$parm1,
$parm2, 
$parm3  
)

'hello'


# end test.ps1 script

# SCC is a alias for a function I have to shell out to the console host as needed
# aka Start-ConsoleCommand
# it has code to prevent the console host from closing so I can work in it if needed.

scc -ConsoleCommand '.\test.ps1 -parm1 abc1 -parm2 abc2  -parm3 abc3

# console window results
hello

Проверьте информацию о процессе

Get-WmiObject Win32_Process -Filter "Name='powershell.exe' AND CommandLine LIKE '%test.ps1%'"

# Results
...
Caption                    : powershell.exe
CommandLine                : "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit -Command  &{ .\test.ps1 -parm1 abc1 -parm2 abc2  -parm3 abc3
...  

Тем не менее, ваш заявленный вариант использования довольно странный. Поскольку, поскольку вы в первую очередь запускаете код и говорите, что вы хотите, чтобы он запускался только один раз, зачем зачем его запускать снова, просто чтобы проверить, что, как вы уже знаете, выполняется?

Если вы говорите, вам нужно запускать его несколько раз последовательно, а затем делать это последовательно.

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

...