Как я могу написать ‘Stream:$DATA’ в PowerShell и удалить ‘:$DATA’ в Batch?

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

Попытался удалить :$DATA поток из файла в , и ничего не работает, кроме , удалить его больше нельзя, используя чистый /?

Воссоздаю/воспроизвожу сценарий и показываю неудачные попытки…

  • 1-я запись строк в :Stream в файл:
>"C:\Path\To\LogError.Log::Stream.Report" (echo/[CopyStatus]&echo/Error=3)

  • 2-я чтение строк из :Stream в файле:
more < "C:\Path\To\LogError.Log:Stream.Report" 
:: вывод:
[CopyStatus]
Error=3

  • 3-я перечисление/проверка :Stream в файле:
dir /r "C:\Path\To\LogError.Log:Stream.Report" | find "$DATA"
:: вывод:
25 LogError.Log:Stream.Report:$DATA

  • 4-я попытки удалить :Stream.Report (:$DATA) из файла множественными попытками:
cd.>"C:\Path\To\LogError.Log:Stream.Report"
cd.>"\\?\C:\Path\To\LogError.Log:StreamReport'"

echo.>"C:\Path\To\LogError.Log:Stream.Report" 
echo.>"\\?\C:\Path\To\LogError.Log:Stream.Report"

more < nul > "C:\Path\To\LogError.Log:Stream.Report" 
more < nul > "\\?\C:\Path\To\LogError.Log:Stream.Report" 

fsutil reparsepoint delete "C:\Path\To\LogError.Log:Stream.Report"
fsutil reparsepoint delete "C:\Path\To\LogError.Log:Stream.Report"

wmic datafile where "name="C:\\Path\\To\\LogError.Log"" delete "Stay"
wmic datafile where "name="C:\\Path\\To\\LogError.Log:Stream.Report"" delete "Stay"

  • 5-я перечисление/проверка (снова) :Stream в файле, чтобы подтвердить, были ли они удалены:
dir /r "C:\Path\To\LogError.Log:Stream.Report" | find "$DATA"
:: вывод 
25 LogError.Log:Stream.Report:$DATAR

more < "C:\Path\To\LogError.Log:Stream.Report" 
:: вывод:
[CopyStatus]
Error=3
  • Ничего не меняется… $DATA остается в файле.

Что я пытаюсь сделать и застрял.
Удалить содержимое :Stream:$DATA из файла:

>dir /r LogError.Log
 Директория C:\Path\To

10/22/2024  05:24 AM            17,083 LogError.Log
                                    25 LogError.Log:Stream.Report:$DATA
               1 файл(ов)         17,083 байт
               0 каталога(ов)  128,989,868,032 байт свободно

Нет проблем, и это работает напрямую с

Remove-Item -Path "C:\Path\To\LogError.Log:Stream.Report" 
Get-Content -Path "C:\Path\To\LogError.Log:Stream.Report" 

Есть ли способ удалить :$DATA с помощью чистого и ? Я ищу решение, которое позволит мне справляться с этим в обеих средах, но сталкиваюсь с ограничениями в каждом инструменте. Как я могу добиться одинаковой функциональности на обеих платформах?

cmd.exe /c '(echo/[CopyStatus]&echo/Error=3)>"C:\Path\To\LogError.Log:Stream.Report"'

:: Не работает:
[System.IO.File]::WriteAllText("C:\Path\To\LogError.Log:Stream.Report", "[CopyStatus]")
[System.IO.File]::WriteAllText("C:\Path\To\LogError.Log:Stream.Report", "[Error=3]"   )

"[CopyStatus]" | Out-File -FilePath "C:\Path\To\LogError.Log:Stream.Report" -Encoding utf8
   "[Error=3]" | Out-File -FilePath "C:\Path\To\LogError.Log:Stream.Report" -Encoding utf8

Но в я не могу удалить, а в я не могу записать. Кажется, я застрял между: PowerShell может выполнять два действия (читать и удалять), в то время как cmd также может делать два действия (записывать и читать).

Почему у меня не может быть всех трех действий в и всех трех действий в ? Есть ли способ это сделать?”

Существует в основном два варианта: скопировать файл в место, которое не поддерживает альтернативные данные поток и затем скопировать файл обратно в его исходное местоположение, или вы можете сделать копию файла, используя команду type:

type original.txt>copy.txt
del original.txt
ren copy.txt original.txt

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

Для решения задачи удаления содержимого потока :$DATA из файла, необходимо обратить внимание на особенности работы с альтернативными потоками данных в Windows. Эти потоки могут вызывать сложности, особенно при использовании различных инструментов командной строки, таких как PowerShell и cmd (Batch).

Понимание проблемы

Альтернативные потоки данных (Alternate Data Streams, ADS) являются частью файловой системы NTFS и дают возможность хранить данные в файлах, которые на первый взгляд выглядят как обычные файлы. Каждый поток может содержать свои собственные данные, и с ними можно работать как с отдельными файлами.

Использование PowerShell для записи в поток

В PowerShell операции с альтернативными потоками данных значительно проще. Для записи в поток можно использовать команду Out-File, а для удаления потока – команду Remove-Item. Пример записи в :Stream.Report:

# Запись содержимого в альтернативный поток
"CopyStatus`nError=3" | Out-File -FilePath "C:\Path\To\LogError.Log:Stream.Report" -Encoding utf8

Удаление потока осуществляется следующим образом:

# Удаление альтернативного потока данных
Remove-Item -Path "C:\Path\To\LogError.Log:Stream.Report"

Посмотрев на вашу ситуацию, стоит упомянуть, что ваш вопрос главный в контексте cmd:

Проблема с Batch (cmd)

К сожалению, в cmd не существует прямой поддержки работы с альтернативными потоками данных. Команды, которые вы перечислили, не сработали из-за особенностей командной строки и ее ограниченных возможностей в отношении ATS. Для подтверждения их отсутствия можно использовать следующую команду:

dir /r "C:\Path\To\LogError.Log:Stream.Report"

Решение при помощи создания нового файла

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

Шаги для удаления потока с помощью cmd:

  1. Создайте временный файл, не содержащий потока:
type "C:\Path\To\LogError.Log" > "C:\Path\To\Temp_LogError.Log"
  1. Удалите оригинальный файл:
del "C:\Path\To\LogError.Log"
  1. Переименуйте временный файл, возвращая его на место оригинала:
rename "C:\Path\To\Temp_LogError.Log" "LogError.Log"

Таким образом, после выполнения этих команд, альтернативный поток :$DATA будет полностью удален.

Заключение

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

Эта информация подытоживает основные подходы и рекомендации, чтобы эффективно управлять альтернативными потоками данных в Windows.

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

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