Мне нравятся инструменты WMIC
и TASKLIST
, но они недоступны в домашних / базовых версиях окон. Другой способ - использовать команду QPROCESS
, доступную почти на всех машинах Windows (для тех, которые имеют терминальные службы - Я думаю, что только выиграть XP без SP2, так что практически каждый компьютер Windows):
@echo off
:check_process
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1
:: QPROCESS can display only the first 12 symbols of the running process
:: If other tool is used the line bellow could be deleted
set process_to_check=%process_to_check:~0,12%
QPROCESS * | find /i "%process_to_check%" >nul 2>&1 && (
echo process %process_to_check% is running
) || (
echo process %process_to_check% is not running
)
endlocal
QPROCESS
команда не так сильна, как TASKLIST
и ограничена показом только 12 символов имени процесса, но следует учитывать, если TASKLIST
недоступен.
Более простое использование, когда оно использует имя, если процесс как аргумент (суффикс .exe
является обязательным в этот случай, когда вы передаете исполняемое имя):
@echo off
:check_process
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
:: .exe suffix is mandatory
set "process_to_check=%~1"
QPROCESS "%process_to_check%" >nul 2>&1 && (
echo process %process_to_check% is running
) || (
echo process %process_to_check% is not running
)
endlocal
Различие между двумя способами использования QPROCESS
заключается в том, что QPROCESS *
отобразит все процессы, в то время как QPROCESS some.exe
будет фильтровать только процессы для текущий пользователь.
Использование WMI
объектов через Windows-скрипт host exe вместо WMIC
также является опцией. Он должен также запускаться на всех машинах Windows (исключая те, где отключен WSH но это редкий случай). Вот файл bat, который перечисляет все процессы через классы WMI и может использоваться вместо QPROCESS
в приведенном выше скрипте (это гибрид jscript / bat и должен быть сохранен как .bat
):
@if (@X)==(@Y) @end /* JSCRIPT COMMENT **
@echo off
cscript //E:JScript //nologo "%~f0"
exit /b
************** end of JSCRIPT COMMENT **/
var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes = new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
var process=processes.item();
WScript.Echo( process.processID + " " + process.Name );
}
И модификация, которая проверяет, запущен ли процесс:
@if (@X)==(@Y) @end /* JSCRIPT COMMENT **
@echo off
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1
cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (
echo process %process_to_check% is running
) || (
echo process %process_to_check% is not running
)
exit /b
************** end of JSCRIPT COMMENT **/
var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes = new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
var process=processes.item();
WScript.Echo( process.processID + " " + process.Name );
}
Эти два параметра можно использовать на машинах, у которых нет TASKLIST
.
Конечная техника использует MSHTA
. Это будет работать на всех машинах Windows с XP и выше и не зависит от настроек хоста Windows Script. вызов MSHTA
мог бы немного снизить производительность (опять же нужно сохранить как bat):
@if (@X)==(@Y) @end /* JSCRIPT COMMENT **
@echo off
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1
mshta "about:" | find /i "%process_to_check%" >nul 2>&1 && (
echo process %process_to_check% is running
) || (
echo process %process_to_check% is not running
)
endlocal
exit /b
************** end of JSCRIPT COMMENT **/
var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes = new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
var process=processes.item();
fso.Write( process.processID + " " + process.Name + "\n");
}
close();
Без перенаправления , Люк Ву или Эрик Константопулос укажите out на:
copy NUL EMptyFile.txt
copy /b NUL EmptyFile.txt
« Как создать пустой текстовый файл из командного файла? » (2008) также указывает на:
type NUL > EmptyFile.txt
# also
echo. 2>EmptyFile.txt
copy nul file.txt > nul # also in qid's answer below
REM. > empty.file
fsutil file createnew file.cmd 0 # to create a file on a mapped drive
Номад упоминает оригинальный :
C:\Users\VonC\prog\tests>aaaa > empty_file
'aaaa' is not recognized as an internal or external command, operable program or batch file.
C:\Users\VonC\prog\tests>dir
Folder C:\Users\VonC\prog\tests
27/11/2013 10:40 <REP> .
27/11/2013 10:40 <REP> ..
27/11/2013 10:40 0 empty_file
В том же духе Самуэль предлагает в комментариях :
самый короткий, который я использую, в основном принадлежит Nomad:
.>out.txt
Он действительно выдает ошибку:
'.' is not recognized as an internal or external command
Но эта ошибка находится на stderr. И >
перенаправляет только stdout, где ничего не было создано.
Следовательно, создается пустой файл. Здесь можно проигнорировать сообщение об ошибке.
(Исходный ответ, ноябрь 2009 г.)
echo.>filename
( echo ""
фактически поместит "" в файл! И echo
без символа '.' поместит " Команда ECHO активирована
" в файл ...)
Примечание: результирующий файл не пустой , но включает последовательность строки возврата: 2 байта.
Это обсуждение указывает на истинное пакетное решение для реального пустого файла:
<nul (set/p z=) >filename
dir filename
11/09/2009 19:45 0 filename
1 file(s) 0 bytes
«
» соединяет nul
на командуset / p
, которая вызовет переменная раньше оставалась неизменной. Как обычно сset / p
, строка справа от знака равенства отображается как подсказка без CRLF.
Так как здесь «строка справа от знака равенства» пуста ... результат - пустой файл.
Разница с cd. > filename
(который упоминается в ответе Патрика Каффа и также создает файл длиной 0 байт) заключается в том, что этот «бит перенаправления» (
<nul (set/p z=hello) >out.txt
<nul (set/p z= world!) >>out.txt
dir out.txt
Команда dir должна указывать размер файла в 12 байтов: «
hello world!
».
echo "" > filename
Я считаю, что это работает в Windows / DOS, но мой последний практический опыт работы с любым из них произошел довольно давно. Я точно знаю, что он работает практически с любой POSIX совместимой ОС.
Вы можете написать что угодно.
//touch.cpp
#include <fstream>
#include <iostream>
int main(int argc, char ** argv;)
{
if(argc !=2)
{
std::cerr << "Must supply a filename as argument" << endl;
return 1;
}
std::ofstream foo(argv[1]);
foo.close();
return 0;
}
Читая комментарии к моему сообщению, я должен признать, что неправильно прочитал вопрос.
В командной строке Windows одним из способов было бы использовать fsutil :
fsutil file createnew <filename> <size>
Пример:
fsutil file createnew myEmptyFile.txt 0
Ниже приведено для командной строки * nix.
touch filename
Эта команда изменяет дату изменения файла или создает ее, если файл не найден.
Если вам действительно нужен полностью пустой файл без вывода на стандартный вывод, вы можете немного схитрить:
copy nul file.txt > nul
Просто перенаправьте stdout на nul, и вывод из копии исчезнет.