Windows上是否有/dev/null?

eyh26e7m  于 2022-12-05  发布在  Windows
关注(0)|答案(9)|浏览(325)

在Windows上,/dev/null的等价物是什么?

toiithl6

toiithl61#

我想你想要NUL,至少在命令提示符或批处理文件内。
例如:

type c:\autoexec.bat > NUL

不创建文件。
(我 * 相信 * 如果您尝试以编程方式创建一个文件,也是如此,但我还没有尝试过。)
在PowerShell中,您需要$null

echo 1 > $null
dfuffjeb

dfuffjeb2#

根据这个message on the GCC mailing list,你可以用文件“nul”代替/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;
}

(此代码的作者为;从他的消息中复制粘贴。)
您还可以通过重定向使用此特殊的“nul”文件。

xnifntxz

xnifntxz3#

Windows中的NUL实际上似乎是任何文件夹中的虚拟路径。就像任何文件系统中的...一样。
使用任何文件夹后加上NUL都可以。
示例:

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

与Linux上的/dev/null具有相同的效果。
这是在Windows 7(64位)上测试的。

shstlldc

shstlldc4#

Jon Skeet是正确的。这里是Windows Embedded文档中的Nul Device Driver页面(我不知道为什么它不在其他地方...)。
下面是另一个:

jdg4fx2g

jdg4fx2g5#

NUL也可以通过编程方式工作。例如:

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

按预期工作而不创建文件。(MSVC++ 12.0)

wecizke3

wecizke36#

如果您需要在Microsoft Windows中执行相当于Linux中/dev/null的符号链接,您可以打开管理员的cmd并键入:

对于文件:

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

或者,对于目录:

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

这将使文件/目录始终为0字节,并且每次写入尝试仍返回成功。

nbysray5

nbysray57#

在Windows10中,如果要像文件一样使用NUL,例如

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

这些答案都不管用。
您会看到错误:

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

但是,如果在cmd.exe中执行以下操作,则该方法有效:

echo 1 > NUL

所以NUL的行为并不完全像/dev/null文件。
但是,对于robocopy命令,您可以执行如下操作:

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

那就成功了!
在Powershell中,$null仅用作stdout重定向

echo 1 > $null

但是你不能在robocopy这样的命令中使用$null来代替文件,$null\null也不起作用。
因此,我所能找到的与PowerShell中的cmd.exe具有相同效果的方法是从PowerShell中调用cmd.exe,如下所示:

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"

所以NUL的行为并不完全像/dev/null文件夹,而是像一个文件夹,可以有幻影文件在它作为一个目标文件时,除非你使用它与>重定向,然后它的行为就像它是一个空设备/文件。
此外,要提到的是,cmd.exe在第一次使用时会创建一个NUL,但我们无法查看它。

anhgbhbe

anhgbhbe8#

您必须在Windows PowerShell中为此使用***start***和***$NUL***:
键入此命令,假定mySum是应用程序的名称,510是要发送的命令行参数。

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

start命令将启动一个分离的进程,效果与&类似。如果您正在运行的程序是一个控制台应用程序,/B选项将阻止start打开一个新的终端窗口。而NUL是Windows中/dev/null的等价物。最后的2>&1将把stderr重定向到stdout,而stdout将全部转到NUL

idv4meu8

idv4meu89#

唯一可以处理NUL的内置工具是好的老copy。但是要确保,你使用开关/b(二进制),否则内容不会被操作系统缓存(这是我的目标)。
将目录(递归)放入操作系统缓存:

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

使用RamMap(来自Sysinternals)进行验证。

相关问题