Войти

Показать полную графическую версию : удаление файлов со сложным наименованием и с кучей "служебных" символов


God-of-Chaos
01-12-2019, 07:28
Каким образом удалять сложноименованные файлы находящимися по длинным путям...

пример
"C:\users\test\GRAPHISOFT\ARCHICAD-64 Папка Журнала\ARCHICAD-64 20.0.0 RUS R1\UsageLogger\Tracker\UsageLogSenderTool[1546929321][9488].track"
"C:\Users\test\AppData\Local\Microsoft\Feeds Cache\GWBZ7T1R\ieonline.microsoft[1].microsoft[1]"


Remove-item не удаляет.
Convert-path выдает пустое значение
$([regex]::Escape("C:\users\test\GRAPHISOFT\ARCHICAD-64 Папка Журнала\ARCHICAD-64 20.0.0 RUS R1\UsageLogger\Tracker\UsageLogSenderTool[1546929321][9488].track")) - выдает ерунду:)
получилось удалить только через [poshfile]::DeleteFile("C:\users\test\GRAPHISOFT\ARCHICAD-64 Папка Журнала\ARCHICAD-64 20.0.0 RUS R1\UsageLogger\Tracker\UsageLogSenderTool[1546929321][9488].track")

как путь можно преобразовать в читаемый для командлета remove-item? так как требуется возврат ошибки в случае проблем с удалением...

а вообще есть необходимость удалить папку профиля пользователя (например c:\users\test) со всем содержимым и включая саму папку

YuS_2
01-12-2019, 08:11
Remove-item не удаляет. »
У командлета есть параметр -LiteralPath, вместо -Path

$([regex]::Escape("C:\users\test\GRAPHISOFT\ARCHICAD-64 Папка Журнала\ARCHICAD-64 20.0.0 RUS R1\UsageLogger\Tracker\UsageLogSenderTool[1546929321][9488].track")) - выдает ерунду »
[management.automation.wildcardpattern]::escape("стро[к]а")

Iska
01-12-2019, 11:58
God-of-Chaos, он их не удаляет только из-за наличия квадратных скобок. Увы, это особенность всех языков, рассматривающих строки изначально не как чистые литералы.

Ещё на тему от Василия Гусева: Квадратные скобки в именах файлов | PowerShell и другие скрипты (https://xaegr.wordpress.com/2009/04/23/parsing-square/).

Busla
01-12-2019, 12:59
God-of-Chaos, Remove-Item вообще криво реализован (https://docs.microsoft.com/ru-ru/previous-versions/powershell/module/Microsoft.PowerShell.Management/Remove-Item?view=powershell-5.0#examples):
Because the Recurse parameter in Remove-Item has a known issue, the command in this example uses Get-ChildItem to get the desired files, and then uses the pipeline operator to pass them to Remove-Item.

находящимися по длинным путям...
пример
"C:\users\test\GRAPHISOFT\ARCHICAD-64 Папка Журнала\ARCHICAD-64 20.0.0 RUS R1\UsageLogger\Tracker\UsageLogSenderTool[1546929321][9488].track" »
длинные пути (Long Paths) - вполне конкретный термин, и он про пути длиннее 260 символов - и да, на них ваш скрипт тоже спотыкнётся, когда они встретятся

$([regex]::Escape("C:\users\test\GRAPHISOFT\ARCHICAD-64 Папка Журнала\ARCHICAD-64 20.0.0 RUS R1\UsageLogger\Tracker\UsageLogSenderTool[1546929321][9488].track")) - выдает ерунду »
Выдаёт он нормальный результат. Непонятно, зачем вы это делаете.

он их не удаляет только из-за наличия квадратных скобок. Увы, это особенность всех языков, рассматривающих строки изначально не как чистые литералы. »
со строками в PoSh всё ok. Как верно заметил YuS_2, дело в неправильном использовании параметров

а вообще есть необходимость удалить папку профиля пользователя (например c:\users\test) со всем содержимым и включая саму папку »
вам будет гораздо проще использовать rmdir из cmd




© OSzone.net 2001-2012