Вопрос или проблема
Попытался удалить :$DATA
поток из файла в cmd, и ничего не работает, кроме powershell, удалить его больше нельзя, используя чистый cmd/batch?
Воссоздаю/воспроизвожу сценарий и показываю неудачные попытки…
- 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 байт свободно
Нет проблем, и это работает напрямую с powershell
Remove-Item -Path "C:\Path\To\LogError.Log:Stream.Report"
Get-Content -Path "C:\Path\To\LogError.Log:Stream.Report"
Есть ли способ удалить :$DATA
с помощью чистого powershell и batch? Я ищу решение, которое позволит мне справляться с этим в обеих средах, но сталкиваюсь с ограничениями в каждом инструменте. Как я могу добиться одинаковой функциональности на обеих платформах?
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
Но в cmd я не могу удалить, а в powershell я не могу записать. Кажется, я застрял между: PowerShell может выполнять два действия (читать и удалять), в то время как cmd также может делать два действия (записывать и читать).
Почему у меня не может быть всех трех действий в 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:
- Создайте временный файл, не содержащий потока:
type "C:\Path\To\LogError.Log" > "C:\Path\To\Temp_LogError.Log"
- Удалите оригинальный файл:
del "C:\Path\To\LogError.Log"
- Переименуйте временный файл, возвращая его на место оригинала:
rename "C:\Path\To\Temp_LogError.Log" "LogError.Log"
Таким образом, после выполнения этих команд, альтернативный поток :$DATA
будет полностью удален.
Заключение
Работа с альтернативными потоками данных в Windows может быть затруднительной из-за отсутствия поддержки в cmd и ограниченной функциональности при использовании PowerShell для записи. Наиболее надежным способом работы является использование PowerShell, когда вам нужно удалять потоки, и комбинация команд в cmd, когда требуется манипуляция данными файлов.
Эта информация подытоживает основные подходы и рекомендации, чтобы эффективно управлять альтернативными потоками данных в Windows.