Вы не можете сделать это из командной строки, вам нужно написать некоторый код (я полагаю, вы не просто ищете утилиту, в противном случае Super User может быть лучше спросить). Я также предполагаю, что ваше приложение имеет все необходимые разрешения для этого (примеры без проверки ошибок).
Сначала получите все потоки заданного процесса, затем вызовите SuspendThread
для остановки каждого из них (и ResumeThread
для возобновления). Он работает, но некоторые приложения могут сбой или зависание, потому что поток может быть остановлен в любой точке, а порядок приостановки / возобновления непредсказуем (например, это может привести к блокировке блокировки). Для однопоточного приложения это может не быть проблемой.
void suspend(DWORD processId)
{
HANDLE hThreadSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
THREADENTRY32 threadEntry;
threadEntry.dwSize = sizeof(THREADENTRY32);
Thread32First(hThreadSnapshot, &threadEntry);
do
{
if (threadEntry.th32OwnerProcessID == processId)
{
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE,
threadEntry.th32ThreadID);
SuspendThread(hThread);
CloseHandle(hThread);
}
} while (Thread32Next(hThreadSnapshot, &threadEntry));
CloseHandle(hThreadSnapshot);
}
Обратите внимание, что эта функция слишком много наивна, чтобы возобновлять потоки, вы должны пропустить потоки, которые были приостановлены, и легко заставить мертвых -lock из-за приостановки / возобновления заказа. Для однопоточных приложений это много, но он работает.
Начиная с Windows XP существует NtSuspendProcess
, но недокументирован . Прочитайте этот пост для примера кода (ссылка для недокументированных функций: news: //comp.os.ms-windows.programmer.win32).
typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);
void suspend(DWORD processId)
{
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId));
NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress(
GetModuleHandle("ntdll"), "NtSuspendProcess");
pfnNtSuspendProcess(processHandle);
CloseHandle(processHandle);
}
Чтобы приостановить выполнение программы, что обычно делает отладчик, для этого вы можете использовать функцию DebugActiveProcess
. Он приостановит выполнение процесса (со всеми потоками все вместе). Для возобновления работы вы можете использовать DebugActiveProcessStop
.
Эта функция позволяет остановить процесс (с учетом его идентификатора процесса), синтаксис очень прост: просто передайте идентификатор процесса, который вы хотите остановить et-voila. Если вы сделаете приложение с командной строкой, вам нужно будет продолжать использовать его экземпляр, чтобы приостановить процесс (или он будет завершен). Подробные сведения см. В разделе Замечания в MSDN.
void suspend(DWORD processId)
{
DebugActiveProcess(processId);
}
Как я уже сказал, в командной строке Windows нет какой-либо полезности для этого, но вы можете вызвать функцию Windows API из PowerShell. Сначала установите скрипт Invoke-WindowsApi , после чего вы можете написать это:
Invoke-WindowsApi "kernel32" ([bool]) "DebugActiveProcess" @([int]) @(process_id_here)
Конечно, если вам это нужно, вы можете сделать для этого alias
.
Поскольку Javascript не имеет функции lookbehind, и поскольку границы слов работают только с членами класса символов \w
, единственный способ - использовать группы (и захватить группы, если вы хотите сделать замену):
(?m)(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])
пример для удаления двух букв:
txt = txt.replace(/(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])/gm, '\1');
Вместо того, чтобы писать совпадение для «словных символов плюс эти символы», может быть целесообразно использовать регулярное выражение, которое не соответствует пробелу:
\S
Он шире по объему, но проще писать / использовать.
Если это слишком wide - используйте эксклюзивный список, а не список включительно:
[^\s\.]
То есть - любой символ, который не является пробелом и , а не точкой. Таким образом, также легко добавить к исключениям.
Границы Word не работают с символами none-ascii , что легко продемонстрировать:
> "yay".match(/\b.*\b/)
["yay"]
> "γaγ".match(/\b.*\b/)
["a"]
Поэтому невозможно использовать \b
для обнаружения слов с греческими символами - каждый символ является совпадающей границей.
Следующая комбинация может использоваться для соответствия двум символьным словам:
pattern = /(^|[\s\.,])(\S{2})(?=$|[\s\.,])/g;
(Точнее: для сопоставления двух последовательностей без пробелов).
То есть:
(^|[\s\.,]) - start of string or whitespace/punctuation (back reference 1)
(\S{2}) - two not-whitespace characters (back reference 2)
($|[\s\.,]) - end of string or whitespace/punctuation (positive lookahead)
Этот шаблон можно использовать так, чтобы удалить соответствующие слова:
"input string".replace(pattern);
Вот jsfiddle , демонстрирующие использование шаблонов в текстах в вопросе.
Попробуйте что-то вроде этого:
\s[a-zA-ZΆΈ-ώἀ-ῼ]{2}\s
|
является специальным символом регулярного выражения и означает «OR»,^
является якорем для начала строки. Первая скобка заменяет границу слова (поскольку вы не можете использовать эту функцию с греческим алфавитом). Первая скобка означает: «начало строки ИЛИ символ, который не является буквой (греческой или латинской)». – Casimir et Hippolyte 16 May 2014 в 20:40