我有一个包含日志的文件夹。
这个文件夹包含很多日志文件。我无法删除这些文件,因为服务器会保留它们。但我可以删除每个文件的内容。打开每个文件并删除内容非常烦人。
您能提供一些让它更快的想法吗?
答案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
因此,下次您想要清除日志文件时,只需
- 运行提供的批处理脚本
- 从 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