Лучший отвечающий
Remove-Item и файл с квадратной скобкой в имени

Вопрос
-
Приветствую уважаемый форум!
Прошу подсказать.
Есть скрипт, который чистит директории от файлов старше N дней.
В директории появились файлы с именем вида [без имени]_XXXXXXX.pdf
Они игнорируются командой скрипта
$files = Get-ChildItem $path -Recurse -File -Exclude $Exclude | Where{$_.LastWriteTime -le "$LastWrite"} foreach ($ff in $files) { Remove-Item -Path $ff -WhatIf }
По остальным отрабатывает нормально
Пожалуйста, подскажите, как и эти файлы тоже удалять?
2 апреля 2018 г. 14:57
Ответы
-
У вас стоит в скрипте LastWriteTime, может лучше стоит использовать CreationTime?
У меня вот такой скрипт отрабатывает без проблем:
Get-ChildItem C:\1234\ -File | ? {$_.CreationTime -le (Get-Date).AddDays(-2)} | Remove-Item -Force -Recurse
А вообще лучше всего выполнить отдельно команду Get-ChildItem и посмотреть попадают ли в этот список нужные вам файлы.- Изменено Sergey Ya 2 апреля 2018 г. 15:13
- Помечено в качестве ответа KazunEditor 3 апреля 2018 г. 6:39
2 апреля 2018 г. 15:10 -
Так в чем проблема заменить -Path на -LiteralPath?
Remove-Item -LiteralPath $ff.FullName -Force
- Изменено KazunEditor 2 апреля 2018 г. 19:20
- Помечено в качестве ответа Reanimator73 3 апреля 2018 г. 6:22
2 апреля 2018 г. 19:20Отвечающий
Все ответы
-
Добрый день!
Попробуйте вот так:
$files = Get-ChildItem $path -Recurse -File -Exclude $Exclude | Where{$_.LastWriteTime -le "$LastWrite"} foreach ($ff in $files) { Remove-Item -Path $ff -WhatIf -Force -Recurse }
2 апреля 2018 г. 15:03 -
Увы, ничего не изменилось2 апреля 2018 г. 15:08
-
У вас стоит в скрипте LastWriteTime, может лучше стоит использовать CreationTime?
У меня вот такой скрипт отрабатывает без проблем:
Get-ChildItem C:\1234\ -File | ? {$_.CreationTime -le (Get-Date).AddDays(-2)} | Remove-Item -Force -Recurse
А вообще лучше всего выполнить отдельно команду Get-ChildItem и посмотреть попадают ли в этот список нужные вам файлы.- Изменено Sergey Ya 2 апреля 2018 г. 15:13
- Помечено в качестве ответа KazunEditor 3 апреля 2018 г. 6:39
2 апреля 2018 г. 15:10 -
У вас стоит в скрипте LastWriteTime, может лучше стоит использовать CreationTime?
Мне необходимо отслеживать те файлы, которые давно не менялись на общих ресурсах сети.
И потом, даже если отбирать их по другому критерию, как это повлияет на возможность удалить файл с квадратной скобкой в названии?
2 апреля 2018 г. 15:14 -
У вас стоит в скрипте LastWriteTime, может лучше стоит использовать CreationTime?
Мне необходимо отслеживать те файлы, которые давно не менялись на общих ресурсах сети.
И потом, даже если отбирать их по другому критерию, как это повлияет на возможность удалить файл с квадратной скобкой в названии?
А причем тут квадратные скобки?
У меня прекрасно удаляются файлы с названиями [без имени]_1234567.pdf , [без имени]_XXXXXXX.pdf
Еще раз - Выполните отдельно команду Get-ChildItem и уже по выводу этой команды проверяйте почему нужные вам файлы не попали в этот список
2 апреля 2018 г. 15:20 -
вот такой кусок кода
$files = Get-ChildItem $path -Recurse -File -Exclude $Exclude | Where{$_.LastWriteTime -le "$LastWrite"} foreach ($ff in $files) { Write-Host $ff Remove-Item -Path $ff -WhatIf -Force -Recurse # WriteLog $LogFile ('Delete file: ' + $ff.FullName) }
вывод такой:
\\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\7222168_2017112810354500.pdf What if: Performing the operation "Remove File" on target "\\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\7222168_2017112810354500.pdf". \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\8067493_2017112810253400.pdf What if: Performing the operation "Remove File" on target "\\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\8067493_2017112810253400.pdf". \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112308360700.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112309293700.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112309295200.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112311040800.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112317033500.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112317034500.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112317215000.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112410595100.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112410595900.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112411182800.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112411185400.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112411381400.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112411382400.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112414295800.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112417270200.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112417274000.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112417284600.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112710213300.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112710410200.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112710411500.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112711235200.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112711240500.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112712153100.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112714583600.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112715033400.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112715051200.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112808462600.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112811462900.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112811470500.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112811474300.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112812245500.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112813204800.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112813211700.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112815384400.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112909582000.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112910104200.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112910453800.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112910463000.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112912500600.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017112913501000.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017113009000800.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017113013211200.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\[без имени]_2017113016444500.pdf \\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\Служебная записка.pdf What if: Performing the operation "Remove File" on target "\\domain\all\DFS_SHARES\SCAN\OFFICE_SCAN\Служебная записка.pdf".
я правильно понимаю, что файлы в массив попадают, но, почему-то игнорируются командой Remove-Item
2 апреля 2018 г. 16:00 -
Вот так все работает исправно:
foreach ($ff in $files) { $ff | Remove-Item -Force -Recurse }
А у вас раньше работал этот скрипт?
Дело в том, что в переменную $ff попадает объект, а -Path должен быть типа [string]
2 апреля 2018 г. 16:26 -
[] - воспринимаются, как подстановные знаки, поэтому если не использовать конвейер, то указать -LiteralPath.
PS > Remove-Item 1[123]1.txt -Verbose PS > Remove-Item -LiteralPath 1[123]1.txt -Verbose VERBOSE: Performing the operation "Remove File" on target "D:\1[123]1.txt".
- Изменено KazunEditor 2 апреля 2018 г. 18:18
2 апреля 2018 г. 18:14Отвечающий -
Как видно, скрипт отрабатывает на обычных файлах, и не отрабатывает на файлах, содержащих квадратную скобку в имени (возможно, причина не в наличии квадратной скобки, а в чем-то еще)
перенес файлы в локальную директорию, поставил максимальные права для Everyone
даже явно указал тип переменной для полного пути к файлу. И все равно не отрабатывает
foreach ($ff in $files) { [string]$var = $ff.FullName write-host $var Write-Host "Type: " $var.GetType().FullName Remove-Item -Path $var -WhatIf -Force }
вывод такой:
I:\temp\7222168_2017112810354500.pdf Type: System.String What if: Performing the operation "Remove File" on target "I:\temp\7222168_2017112810354500.pdf". I:\temp\8067493_2017112810253400.pdf Type: System.String What if: Performing the operation "Remove File" on target "I:\temp\8067493_2017112810253400.pdf". I:\temp\[без имени]_2017112308360700.pdf Type: System.String I:\temp\[без имени]_2017112309293700.pdf Type: System.String I:\temp\[без имени]_2017112317033500.pdf Type: System.String I:\temp\[без имени]_2017112317034500.pdf Type: System.String
Дополнение:
если любой файл, который раньше успешно удалялся этим кодом, переименовать, добавив вначале [без имени], то он тоже игнорируется командой Remove-Item
- Изменено Reanimator73 2 апреля 2018 г. 19:05 Дополнение
2 апреля 2018 г. 18:50 -
Так в чем проблема заменить -Path на -LiteralPath?
Remove-Item -LiteralPath $ff.FullName -Force
- Изменено KazunEditor 2 апреля 2018 г. 19:20
- Помечено в качестве ответа Reanimator73 3 апреля 2018 г. 6:22
2 апреля 2018 г. 19:20Отвечающий -
Так в чем проблема заменить -Path на -LiteralPath?
Remove-Item -LiteralPath $ff.FullName -Force
- Изменено Reanimator73 3 апреля 2018 г. 6:23
3 апреля 2018 г. 6:23