在Windows下如何快速清除大量文本文件的内容?

在Windows下如何快速清除大量文本文件的内容?

我有一个包含日志的文件夹。

这个文件夹包含很多日志文件。我无法删除这些文件,因为服务器会保留它们。但我可以删除每个文件的内容。打开每个文件并删除内容非常烦人。

您能提供一些让它更快的想法吗?

答案1

我遇到过和你一样的情况,某个应用程序不断写入日志文件,我必须在不关闭应用程序的情况下清除内容。幸运的是,我只有一个文件,我可以在 Notepad++ 中打开它,按Ctrl+A然后按Delete。如果有多个文件,只需使用以下 PowerShell 脚本

Get-ChildItem -Recurse log*.txt | ForEach-Object {
    $fs = [IO.FileStream]::new($_.FullName, `
        [IO.FileMode]::Truncate, [IO.FileAccess]::Write, [IO.FileShare]::Write)
    $fs.Close()
}

(如果不是,则调用$fs.SetLength(0)截断文件)[IO.FileMode]Truncate

这是因为日志文件已打开FILE_SHARE_WRITE模式与许多人认为在 Windows 中无法删除或编辑打开的文件的观点相反。后续打开也必须处于共享模式。这就是为什么cmd 或 PowerShell 中的>>>不起作用的原因,因为它们会正常打开文件。下面是一个非常简单的 C++,用于演示如何在共享模式下创建文件

#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <fileapi.h>
#include <cstdlib>
#include <ctime>
#include <cstdio>

int main() {
    srand(unsigned(time(nullptr)));
    const wchar_t* fileName = LR"(D:\logs\log1.txt)";

    // Create file with shared read/write permission
    HANDLE h = CreateFile(fileName,
        GENERIC_WRITE,                      // open for writing
        FILE_SHARE_READ | FILE_SHARE_WRITE, // share for reading/writing
        NULL,                               // default security
        CREATE_NEW,
        FILE_ATTRIBUTE_NORMAL,              // normal file
        NULL);                              // no attr. template

    if (h) {
        for (int i = 0; i < 100; i++) {
            DWORD n;
            char str[64];
            int l = sprintf_s(str, sizeof str, "%d: %d\n", i, rand());
            WriteFile(h, str, l, &n, NULL); FlushFileBuffers(h);
            Sleep(3000);
        }
        CloseHandle(h);
    }
}

它会定期创建log1.txt并写入。我还有以下 PowerShell 脚本来创建另一个共享日志文件

$fs = [IO.FileStream]::new('D:\logs\log2.txt', `
    [IO.FileMode]::OpenOrCreate, [IO.FileAccess]::Write, [IO.FileShare]::ReadWrite)
for ($i = 0; $i -lt 100; $i++) {
    $t = [Text.Encoding]::ASCII.GetBytes("$i $(Get-Random)`r`n")
    $fs.Write($t, 0, $t.Length); $fs.Flush()
    Sleep 3
}
$fs.Close()

之后我运行上面的命令,所有日志文件都被清除了

答案2

将以下代码保存为批处理文件并运行它。

您可以省去每次输入命令的麻烦:)

更改M:\Newfolder\&*.txt以分别反映您的路径和日志文件扩展名。

@ECHO OFF
setlocal EnableDelayedExpansion
FOR /R M:\Newfolder\ %%G IN (*.txt) DO (
    TYPE nul > %%G
)
pause

更新

您可以尝试创建一个宏来自动执行您想要执行的操作。

查看 ellak 提供的第一个答案这里

一次打开所有日志文件,然后每次运行此宏。

如果您甚至想要自动执行该操作(一次打开所有日志文件),那么请运行下面的批处理脚本。

@ECHO OFF
setlocal EnableDelayedExpansion
FOR /R M:\Newfolder\ %%G IN (*.txt) DO (
    notepad++.exe %%G
)
pause

因此,下次您想要清除日志文件时,只需

  1. 运行提供的批处理脚本
  2. 从 Notepad++ 运行宏

有一种方法可以从同一个脚本运行它们,但这需要我不太熟悉的 NPPExec 插件。请告诉我您是否需要插件,或者上面提供的解决方案是否足够。

答案3

只是一个想法,如果该文件正在使用而您无法清除它,并且 Notepad++ 允许您清除它,为什么不像@Dhiwakar Ravikumar 提到的那样直接使用 Notepad++ 中的脚本呢?

如果脚本不行,而且假设你有相当多的日志文件,为什么不直接在 Notepad++ 中打开它们,选择第一个打开的选项卡,然后按Ctrl+ A,然后按Delete键,然后Ctrl按 + S,然后Ctrl按 + W?这样会选择文件中的所有文本,删除它,保存文件,然后关闭它,然后执行相同的操作(就像脚本一样)

答案4

从命令行:

FOR /R C:\YourFolder %f IN (*.LOG) DO TYPE NUL>%f

或者,从批处理文件中:

FOR /R C:\YourFolder %%f IN (*.LOG) DO TYPE NUL>%%f

相关内容