Используя Powershell v2.0, я хочу удалить любые файлы старше X дней:
$backups = Get-ChildItem -Path $Backuppath |
Where-Object {($_.lastwritetime -lt (Get-Date).addDays(-$DaysKeep)) -and (-not $_.PSIsContainer) -and ($_.Name -like "backup*")}
foreach ($file in $backups)
{
Remove-Item $file.FullName;
}
Однако, когда $ backups пусто, я получаю: Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
Я пробовал:
- Защита foreach с
if (!$backups)
- Защита удаляемого предмета с помощью
if (Test-Path $file -PathType Leaf)
- Защита удаляемого предмета с помощью
if ([IO.File]::Exists($file.FullName) -ne $true)
Кажется, что ничего из этого не работает, что, если рекомендуемый способ запретить ввод цикла foreach, если список пуст?
powershell
STEB
источник
источник
Ответы:
В Powershell 3
foreach
оператор не повторяется,$null
и проблема, описанная OP, больше не возникает.Из сообщения блога Windows PowerShell. Новые возможности языка V3 :
Для PowerShell
$PSVersionTable.PSVersion.Major -le 2
см. Следующее для оригинального ответа.У вас есть два варианта, я в основном использую второй.
Проверьте
$backups
нет$null
. ПростойIf
цикл может проверить не$null
Или
Инициализировать
$backups
как пустой массив. Это позволяет избежать неоднозначности проблемы «повторяющихся пустых массивов», о которой вы спрашивали в своем последнем вопросе .Извините, я не предоставил пример интеграции вашего кода. Обратите внимание на
Get-ChildItem
командлет, заключенный в массив. Это также будет работать с функциями, которые могут возвращать$null
.источник
Я знаю, что это старый пост, но я хотел бы отметить, что командлет ForEach-Object не сталкивается с той же проблемой, что и использование ключевого слова ForEach. Таким образом, вы можете передать результаты DIR в ForEach и просто сослаться на файл, используя $ _, например:
Вы можете фактически переслать саму команду Dir через канал и избежать даже назначения переменной, например:
Я добавил разрывы строк для удобства чтения.
Я понимаю, что некоторые люди любят ForEach / In для удобства чтения. Иногда объект ForEach может стать немного волосатым, особенно если вы вкладываете, так как становится трудно следовать ссылке $ _. Во всяком случае, для такой небольшой операции это идеально. Многие люди также утверждают, что это быстрее, но я обнаружил, что это немного.
источник
foreach
оператор больше не вступает в силу$null
, поэтому ошибка, описанная OP, больше не возникает. См. Раздел «Оператор ForEach не выполняет итерации по $ null» в публикации блога Powershell. Новые возможности языка V3 .Я разработал решение, выполнив запрос дважды, один раз для получения файлов и один раз для подсчета файлов, приведя get-ChilItem для возврата массива (приведение $ backups в качестве массива после того, как факт не работает) ,
По крайней мере, он работает должным образом (производительность не должна быть проблемой, так как файлов не будет больше десятка), если кто-нибудь знает решение с одним запросом, пожалуйста, опубликуйте его
источник
Используйте следующее, чтобы оценить, есть ли в массиве какое-либо содержимое:
Если переменная не существует, Powershell просто оценит ее как ложную, поэтому нет необходимости проверять, существует ли она.
источник