Как создать пустой файл в командной строке в Windows?

Мне нравятся инструменты 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();

450
задан VonC 9 April 2019 в 22:43
поделиться

7 ответов

Без перенаправления , Люк Ву или Эрик Константопулос укажите 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 байт) заключается в том, что этот «бит перенаправления» ( ) можно использовать для эхо-строк без каких-либо CR :

<nul (set/p z=hello) >out.txt
<nul (set/p z= world!) >>out.txt
dir out.txt

Команда dir должна указывать размер файла в 12 байтов: « hello world! ».

537
ответ дан 22 November 2019 в 22:55
поделиться
echo "" > filename

Я считаю, что это работает в Windows / DOS, но мой последний практический опыт работы с любым из них произошел довольно давно. Я точно знаю, что он работает практически с любой POSIX совместимой ОС.

28
ответ дан 22 November 2019 в 22:55
поделиться

Вы можете написать что угодно.

//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;
}
11
ответ дан 22 November 2019 в 22:55
поделиться

Читая комментарии к моему сообщению, я должен признать, что неправильно прочитал вопрос.

В командной строке Windows одним из способов было бы использовать fsutil :

fsutil file createnew <filename> <size>

Пример:

fsutil file createnew myEmptyFile.txt 0

Ниже приведено для командной строки * nix.

touch filename

Эта команда изменяет дату изменения файла или создает ее, если файл не найден.

32
ответ дан 22 November 2019 в 22:55
поделиться

Если вам действительно нужен полностью пустой файл без вывода на стандартный вывод, вы можете немного схитрить:

copy nul file.txt > nul

Просто перенаправьте stdout на nul, и вывод из копии исчезнет.

74
ответ дан 22 November 2019 в 22:55
поделиться

Другой способ:

cd. > filename
99
ответ дан 22 November 2019 в 22:55
поделиться

копировать с SomeFile.txt Введите

Ctrl-Z Введите

6
ответ дан 22 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

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