Аналог dev null в windows

In Windows10, if you want to use NUL like a file e.g.

robocopy .\test NUL /move /minage:30 
# delete all files older than 30 days using robocopy

These answers all don’t work.

You get the error:

ERROR 123 (0x0000007B) Accessing Destination Directory \\.\NUL\
The filename, directory name, or volume label syntax is incorrect.

However, it works if you do in cmd.exe:

echo 1 > NUL

So NUL doesn’t behave exactly like a /dev/null file.

However, for the robocopy command, you can do something like:

robocopy .\test NUL\null /move /minage:30 

Then it works!

In Powershell, the $null works only as stdout redirection

echo 1 > $null

But you can’t use $null in a command like for robocopy instead of a file.
Neither does $null\null work.

So all I could find to have the same effect like cmd.exe in PowerShell, is to call cmd.exe from within PowerShell like this:

mkdir test1
cd test1
echo "" > test1.txt
echo "" > test2.txt
echo "" > test3.txt

$path = '.\test1'
cmd.exe /c "robocopy $path NUL\null /move"

# also this works:
cmd.exe /c "robocopy $path .\NUL\null /move"

So NUL doesn’t behave exactly like /dev/null folder but like a folder which can have phantom files inside it when used as a target file except you use it with > redirection, then it behaves as it is like a null device/file.

In addition it is to be mentioned that cmd.exe creates a NUL when first used. But one cannot look into it.

Время на прочтение
5 мин

Количество просмотров 89K

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

Перенаправления

Как обычно:

echo foo > bar
echo foo 2> bar
echo foo > bar 2>&1

cat

Да, в Windows есть аналог многоликой команды cat, которая является одной из команд, выражающих суть UNIX’а. Это команда type. Она принимает один или несколько аргументов — имена файлов.

type file

Если нужно, чтоб type читал с экрана (например, если нужно создать файл, на лету наполнив его содержимым), то нужно набрать

type con > file

con — это аналог /dev/tty (подробнее об этом в следующем разделе).
То есть вышеприведённая команда является аналогом UNIX’овой команды cat /dev/tty > file или cat - > file или просто cat > file.

Когда вы закончите набирать файл, нажмите на новой строке Ctrl-Z и Enter. Это признак конца файла, аналог Ctrl-D в UNIX’е.

Сейчас будет куча технических подробностей про Ctrl-D и Ctrl-Z, их можно пропустить и перейти к следующему разделу.

В UNIX’е, когда юзер нажимает Ctrl-D, эта комбинация не обрабатывается самим приложением (например, в GNU/Linux в tty1 она обрабатывается ядром, если включен CONFIG_VT [на сегодняшний день (2012) CONFIG_VT включен по дефолту на десктопе, хотя есть планы по её выкидыванию]). А запущенное приложение получает EOF (End Of File, конец файла) в чистом виде (а не саму комбинацию клавиш или символ Ctrl-D). То есть как если бы ввод просто закончился. Иными словами, getchar в приложении возвращает EOF, а read — 0.

В Windows то же самое, Ctrl-Z и Enter заставляют getchar вернуть EOF.

/dev/null, /dev/tty и т. д.

Аналог /dev/null — это устройство nul. Причём оно как бы присутствует в каждой папке. Это тянется со времён старых версий DOS’а, когда не было папок.

Теперь о других устройствах. Аналог /dev/tty — это con, от слова console. Причём con — это аналог именно /dev/tty, а не /dev/console, так как в Windows у каждого окна командной строки con свой.

Аналоги /dev/ttyS0, /dev/ttyS1, /dev/ttyS2, /dev/ttyS3 — это com1, com2, com3, com4 (но винде есть ещё com5 и т. д.). Это устройства serial console, они же COM-порты, они же последовательные порты.

Обычными средствами винды нельзя создать файл или папку с именем con или nul и т. д. Но можно исхитриться: mkdir \\.\c:\con.

Есть шуточная версия того, почему в Windows трудно создать файл с именем con. А именно: у Билла Гейтса было прозвище con, то есть ботаник. Подробнее см., например, здесь: vk.com/wall-31439745_2474 (естественно, этой информации нельзя доверять).

Подробнее про эти устройства тут: en.wikipedia.org/wiki/Device_file#MS-DOS.

/dev, /dev/sda1, …

После прочтения предыдущего раздела у вас мог возникнуть вопрос: и что, всё? /dev/null, /dev/tty и ещё несколько штук девайсов? А где /dev/sda1 и прочие бесчисленные устройства? Ведь в GNU/Linux’е папка /dev может содержать сотни устройств!

Ответ таков: да, в Windows есть целая папка с такими устройствами. Это \Device. Её сложно посмотреть через обычный пользовательский интерфейс. Там лежат устройства типа \Device\HarddiskVolume1 — это аналог GNU/Linux’ового /dev/sda1.

Эти устройства появились в NT-шных версиях Windows’а и не тянутся с DOS’овых времён, в отличие от устройств из предыдущего раздела.

Пайпы, они же конвееры

cmd1 | cmd2, так же, как и в UNIX.

/etc/fstab

Его аналог — это ветка HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices в реестре Windows (да, да, в винде, как и в UNIX, есть понятие монтирования). Кстати, если у вас до этого были проблемы с переносом установленного Windows’а с одного раздела на другой, или с переименованием дисков в Windows’е или с чем-то ещё подобным, то — вот оно, решение!

Сейчас будет рассказ для тех, кто задумал перенести винду с одного раздела на другой. Остальные могут его пропустить и перейти к следующему разделу.

Если, скажем, вы перенесли Windows с одного раздела на другой, то после этого нужно сделать два шага: разобраться с загрузчиком и его конфигами (об этом в следующем разделе) и подредактировать этот самый ключ реестра (в общем-то так же, как и в GNU/Linux’е: GRUB + fstab). Если ключ не подредактировать, то винда загрузиться не сможет, так начнёт грузиться с нового раздела (то есть того, на который мы копирнули винду), а продолжит — со старого (то есть того, с которого мы копирнули винду). Все системные вещи будут загружены с нового, а всякие Касперские — со старого. Итак, нужно удалить из этой ветки все записи, кроме записи «(По умолчанию)». Тогда винда забудет всё, что знала о разделах и при следующем запуске будет считать своим разделом тот, с которого запустилась (что нам и надо). Короче говоря, автоматически определит разделы.

Правда, тут возникает вопрос: а как подредактировать реестр какой-нибудь винды, не загружаясь в неё? Хм, я для этого использовал Windows PE, который входил в комплект пиратской сборки винды, поэтому я подробности рассказывать не буду. (См. другие способы в этой ветке: geektimes.ru/post/156749/#comment_5355987 от EndUser.)

Ещё несколько вариантов:

  • Почистить реестр, выключить компьютер (можно «жёстко»), а потом копирнуть винду. Однако, я это не проверял. Не факт, что винда даст вам отредактировать этот ключ реестра и что она не заполнит его снова при выключении
  • Отредактировать реестр, и сразу же, не выключая комп, копирнуть запущенную винду на другой раздел. Но и это тоже не проверялось
  • Если вы копируете винду с одного физического диска на другой, можно после копирования вынуть из компьютера старый физический диск и загрузиться в новый хотя бы один раз (чтоб винда обновила MountedDevices). Потом можно вставить старый диск обратно. Такой же трюк можно проделать даже с разделами на одном физическом диске: просто временно удалить старый раздел, а потом восстановить его обратно (ясно, что делать это нужно крайне осторожно). Ну и конечно же, всё это не проверялось :))
  • Смонтировать реестр Windows в GNU/Linux как winregfs

И наконец: использовать разные программы для копирования/бекапов разделов (типа Acronis) бесполезно: все они не меняют реестр (скорее всего), поэтому работать в такой ситуации (копирование винды в пределах одного компа) не будут.

И ещё: весь материал этого раздела проверялся только на Windows XP.

/boot/grub/grub.cfg

В Windows XP его аналог — это файл boot.ini в корне раздела с Windows, а в Windows 7 — это Windows Boot Manager.

Мощный командный интерпретатор

В стандартном интерпретаторе (то есть в cmd.exe) есть много разных фич типа ветвления, так же, как и в UNIX’овых интерпретаторах. Там даже есть дебаговый вывод (а-ля set -x), а именно echo on, правда он включен по дефолту и обычно первым действием в скрипте его отключают (echo off, разумеется).

Вообще, виндовая команда echo крайне непоследовательна: её действие довольно странным образом зависит от аргумента:

cmd.exe bash
echo foo echo foo
echo on set -x
echo off set +x
echo shopt -o xtrace

После лицезрения этой таблицы все юниксоиды, конечно же, схватились за голову и сказали: «Что за идиоты проектировали винду?» Впрочем, в UNIX’е тоже не всё гладко: с какой стати set -x включает дебаг, а set +x выключает его??? То же самое относится к остальным режимам, включаемым командой set.

Ах да, я же обещал мощный командный интерпретатор. :) cmd.exe таковым, конечно же, не является. А вот PowerShell — является. Одной из особенностей PowerShell’а является то, что он «понимает» обычные UNIX’овые команды, например, ls. Правда, на самом деле эта команда похожа на UNIX’овую лишь своим названием и идеей, опции у этого ls всё равно совсем другие. ls — это всего лишь один из алиасов на Get-ChildItem. А ещё в винде есть полноценный IDE для написания PowerShell-скриптов с визуальным отладчиком! Вы можете себе такое представить в UNIX’е? Да, есть конечно bashdb, но визуальный отладчик, конечно же, удобнее.

Спасибо Evgeny_Shiryaev, 6opoDuJIo, amdf, easyman, EndUser, risik, NoOne и aik за ценные замечания и исправления ошибок.

If I want to ignore stdout of a command, I do this on *nix:

myprog > /dev/null

How do I achieve the same on Windows (in cmd or a batch file)?

Heptite's user avatar

Heptite

19.5k5 gold badges59 silver badges72 bronze badges

asked Apr 24, 2010 at 3:57

Sridhar Ratnakumar's user avatar

2

answered Apr 24, 2010 at 4:05

John T's user avatar

Just tried myprog > NUL on my Windows console, doesn’t work.
Should be myprog>NUL (no space characters) e.g. npm i>NUL works.

answered Apr 13 at 12:32

papi Jo's user avatar

2

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

What is the equivalent of /dev/null on Windows?

This question is related to
windows

The answer is


I think you want NUL, at least within a command prompt or batch files.

For example:

type c:\autoexec.bat > NUL

doesn’t create a file.

(I believe the same is true if you try to create a file programmatically, but I haven’t tried it.)

In PowerShell, you want $null:

echo 1 > $null

According to this message on the GCC mailing list, you can use the file «nul» instead of /dev/null:

#include <stdio.h>

int main ()
{
    FILE* outfile = fopen ("/dev/null", "w");
    if (outfile == NULL)
    {
        fputs ("could not open '/dev/null'", stderr);
    }
    outfile = fopen ("nul", "w");
    if (outfile == NULL)
    {
        fputs ("could not open 'nul'", stderr);
    }

    return 0;
}

(Credits to Danny for this code; copy-pasted from his message.)

You can also use this special «nul» file through redirection.


NUL in Windows seems to be actually a virtual path in any folder. Just like .., . in any filesystem.

Use any folder followed with NUL will work.

Example,

echo 1 > nul
echo 1 > c:\nul
echo 1 > c:\users\nul
echo 1 > c:\windows\nul

have the same effect as /dev/null on Linux.

This was tested on Windows 7, 64 bit.



NUL works programmatically as well. E.g. the following:

freopen("NUL", "w", stderr);

works as expected without creating a file. (MSVC++ 12.0)


If you need to perform in Microsoft Windows the equivalent of a symlink to /dev/null in Linux you would open and administrator’s cmd and type:

For files:

mklink c:\path\to\file.ext NUL:

Or, for directories:

mklink /D c:\path\to\dir NUL:

This will keep the file/direcotry always at 0 byte, and still return success to every write attempt.


You have to use start and $NUL for this in Windows PowerShell:

Type in this command assuming mySum is the name of your application and 5 10 are command line arguments you are sending.

start .\mySum  5 10 > $NUL 2>&1

The start command will start a detached process, a similar effect to &. The /B option prevents start from opening a new terminal window if the program you are running is a console application. and NUL is Windows’ equivalent of /dev/null. The 2>&1 at the end will redirect stderr to stdout, which will all go to NUL.


Problem Description:

What is the equivalent of /dev/null on Windows?

Solution – 1

I think you want NUL, at least within a command prompt or batch files.

For example:

type c:autoexec.bat > NUL

doesn’t create a file.

(I believe the same is true if you try to create a file programmatically, but I haven’t tried it.)

In PowerShell, you want $null:

echo 1 > $null

Solution – 2

According to this message on the GCC mailing list, you can use the file “nul” instead of /dev/null:

#include <stdio.h>

int main ()
{
    FILE* outfile = fopen ("/dev/null", "w");
    if (outfile == NULL)
    {
        fputs ("could not open '/dev/null'", stderr);
    }
    outfile = fopen ("nul", "w");
    if (outfile == NULL)
    {
        fputs ("could not open 'nul'", stderr);
    }

    return 0;
}

(Credits to Danny for this code; copy-pasted from his message.)

You can also use this special “nul” file through redirection.

Solution – 3

Jon Skeet is correct. Here is the Nul Device Driver page in the Windows Embedded documentation (I have no idea why it’s not somewhere else…).

Here is another:

  • The null device in the registry
  • Special file names
  • More on file naming

Solution – 4

NUL in Windows seems to be actually a virtual path in any folder. Just like .., . in any filesystem.

Use any folder followed with NUL will work.

Example,

echo 1 > nul
echo 1 > c:nul
echo 1 > c:usersnul
echo 1 > c:windowsnul

have the same effect as /dev/null on Linux.

This was tested on Windows 7, 64 bit.

Solution – 5

NUL works programmatically as well. E.g. the following:

freopen("NUL", "w", stderr);

works as expected without creating a file. (MSVC++ 12.0)

Solution – 6

You have to use start and $NUL for this in Windows PowerShell:

Type in this command assuming mySum is the name of your application and 5 10 are command line arguments you are sending.

start .mySum  5 10 > $NUL 2>&1

The start command will start a detached process, a similar effect to &. The /B option prevents start from opening a new terminal window if the program you are running is a console application. and NUL is Windows’ equivalent of /dev/null. The 2>&1 at the end will redirect stderr to stdout, which will all go to NUL.

Solution – 7

If you need to perform in Microsoft Windows the equivalent of a symlink to /dev/null in Linux you would open and administrator’s cmd and type:

For files:

mklink c:pathtofile.ext NUL:

Or, for directories:

mklink /D c:pathtodir NUL:

This will keep the file/direcotry always at 0 byte, and still return success to every write attempt.

Solution – 8

In Windows10, if you want to use NUL like a file e.g.

robocopy .test NUL /move /minage:30 
# delete all files older than 30 days using robocopy

These answers all don’t work.

You get the error:

ERROR 123 (0x0000007B) Accessing Destination Directory \.NUL
The filename, directory name, or volume label syntax is incorrect.

However, it works if you do in cmd.exe:

echo 1 > NUL

So NUL doesn’t behave exactly like a /dev/null file.

However, for the robocopy command, you can do something like:

robocopy .test NULnull /move /minage:30 

Then it works!

In Powershell, the $null works only as stdout redirection

echo 1 > $null

But you can’t use $null in a command like for robocopy instead of a file.
Neither does $nullnull work.

So all I could find to have the same effect like cmd.exe in PowerShell, is to call cmd.exe from within PowerShell like this:

mkdir test1
cd test1
echo "" > test1.txt
echo "" > test2.txt
echo "" > test3.txt

$path = '.test1'
cmd.exe /c "robocopy $path NULnull /move"

# also this works:
cmd.exe /c "robocopy $path .NULnull /move"

So NUL doesn’t behave exactly like /dev/null folder but like a folder which can have phantom files inside it when used as a target file except you use it with > redirection, then it behaves as it is like a null device/file.

In addition it is to be mentioned that cmd.exe creates a NUL when first used. But one cannot look into it.

Solution – 9

The only built-in tool, which can deal with NUL is the good old copy.
But make sure, you use the switch /b (binary), otherwise the content won’t be cached by OS (that was my goal).

Put a directory (recursive) to OS cache:

for /f "delims=" %f in ('dir /s /b /a-d D:Solrdata') do @copy /b "%f" nul > nul

Use the RamMap (from Sysinternals) to verify.

  • Анализатор жесткого диска windows 10
  • Аналог word скачать бесплатно для windows 10
  • Аналог adobe flash player для windows 10
  • Аналог parallels desktop для windows
  • Аналог daemon tools для windows 10