Как быстро очистить содержимое множества текстовых файлов в Windows?

Вопрос или проблема

У меня есть папка с логами.

Эта папка содержит много файлов логов. Я не могу удалить эти файлы, потому что сервер их хранит. Но я могу удалить содержимое каждого файла. Очень неудобно открывать каждый файл и удалять содержимое.

Можете предложить идеи, как сделать это быстрее?

У меня была такая же ситуация, как и у вас, когда файл лога непрерывно записывается каким-то приложением, и мне нужно очистить содержимое, не закрывая приложение. К счастью, у меня был только один файл, и я могу открыть его в 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()

После этого я запустил команду сверху, и все файлы логов очищены

Сохраните следующий код как пакетный файл и запустите его.

Вы можете избежать того, чтобы каждый раз вводить команду :).

Измените 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, в которых я не очень разбираюсь. Пожалуйста, дайте мне знать, если вы хотите это с плагином или если предоставленное выше решение будет достаточно.

Просто мысль: если файл используется, и вы не можете его очистить, и Notepad++ позволяет его очистить, почему бы не использовать сценарий в Notepad++, как упоминалось @Dhiwakar Ravikumar?

Если сценарии не рассматриваются, и предположим, что у вас есть довольно много файлов логов, почему бы просто не открыть их все в Notepad++, выбрать первую открытую вкладку и нажать Ctrl+A, затем Delete, затем Ctrl+S, затем Ctrl+W? Это выберет весь текст в файле, удалит его, сохранит файл, затем закроет его и затем просто повторите то же самое (как сценарий)

С командной строки:

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

Или из пакетного файла:

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

Ответ или решение

Как быстро очистить содержимое множества текстовых файлов в Windows

Теоретическая основа

Когда речь идет об автоматизации задач в IT, одной из ключевых целей является повышение эффективности работы. В нашем случае мы рассматриваем автоматизацию процесса очистки содержимого множества лог-файлов в операционной системе Windows. При этом физическое удаление файлов невозможно, так как они поддерживаются сервером, но удаление содержимого файлов является допустимым.

Задача автоматизации особенно актуальна, когда функционирует масштабируемое приложение, генерирующее большое количество лог-файлов. Открытие и ручное удаление содержимого каждого файла — крайне неэффективный метод, который отнимает значительное количество времени.

Практическое решение

Одним из простейших, но в то же время мощных инструментов для автоматизации задач в Windows является Windows PowerShell. PowerShell предоставляет расширенные возможности для работы с файлами и может значительно упростить задачу очистки содержимого лог-файлов.

Перечислим возможные подходы:

  1. Использование PowerShell для Затирания Файлов:

    В большинстве случаев, PowerShell способен предложить максимально удобный способ решения вашей задачи. Использование нижеприведенного скрипта позволит вам рекурсивно пройтись по всем файлам в указанной директории, открывая каждый из них и затиряя его содержимое. Это достигается за счет использования класса [IO.FileStream] с режимом FileMode.Truncate:

    Get-ChildItem -Recurse путь\к\вашей\папке\*.log | ForEach-Object {
        $fs = [IO.FileStream]::new($_.FullName, `
        $fs.Close()
    }

    Примечание: Убедитесь, что лог-файлы открыты с режимом FILE_SHARE_WRITE, иначе изменение их содержимого окажется невозможным.

  2. Использование командных файлов (Batch Files):

    Еще один способ автоматизации подобных задач — использование простых командных файлов. Способ подходит, если вы предпочитаете работу через командную строку (cmd). Пример батч-файла:

    @ECHO OFF
    setlocal EnableDelayedExpansion
    FOR /R путь\к\вашей\папке\ %%G IN (*.log) DO (
        TYPE nul > %%G
    )
    pause

    Этот файл, аналогично PowerShell скрипту, проходит по всем лог-файлам в указанной директории и затирет их содержимое.

  3. Использование Notepad++ и Скриптов:

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

  4. Интерактивное управление ручками файлов через разработку на C++:

    Если PowerShell или командные файлы не могут напрямую работать с файлами из-за конфигурации приложений (например, файлы заблокированы к доступу на запись), можно использовать более сложные методы с использованием программных скриптов на C++. Создание файла в режиме разделения (File Share Mode) позволяет работать с данными без помех.

Применение

Правильное внедрение вышеописанных решений существенно сократит время на рутинные операции. Автоматизация данной задачи позволяет снизить риск ошибок, связанных с ручным вмешательством, и даёт больше свободного времени для решения других профессиональных задач.

При работе в крупных проектах, где в логах идет постоянная запись и их очистка необходима для мониторинга и анализа, данный подход позволяет легко поддерживать актуальность данных без вмешательства в системные процессы. Знание и использование таких инструментов, как PowerShell и автоматизация через C++ код, делает вас более гибким и продуктивным специалистом.

Благодаря этим методам, IT-специалисты могут сосредоточиться на решении стратегических задач, оставляя подобные процессы автоматизированными, тем самым ускоряя процессы эксплуатации и улучшая состояние и поддержку логирования на серверах.

Оцените материал
Добавить комментарий

Капча загружается...