Удаление локальных файлов в сценарии WinSCP [дубликат]

В macOS High Sierra (10.13.1) и Java версии 9 вам нужно использовать несколько другой путь JVM (обратите внимание на недостающую папку jre в пути по сравнению с инструкциями для более ранних версий Java):

sudo ln -f -s $(/usr/libexec/java_home)/lib/server/libjvm.dylib /usr/local/lib

Вы также должны уведомить R о JVM:

ln -s /usr/local/lib/libjvm.dylib /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/
144
задан Ewen Cartwright 16 June 2014 в 09:49
поделиться

9 ответов

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -Recurse

Это удалит старые папки и содержимое.

1
ответ дан Aigar 22 August 2018 в 22:23
поделиться

Другой способ - вычесть 15 дней с текущей даты и сравнить CreationTime с этим значением:

$root  = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)

Get-ChildItem $root -Recurse | ? {
  -not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
15
ответ дан Ansgar Wiechers 22 August 2018 в 22:23
поделиться

просто (PowerShell V5)

Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt  (Get-Date).AddDays(-15)  | Remove-Item -Force
22
ответ дан Esperento57 22 August 2018 в 22:23
поделиться

Другая альтернатива (15. автоматически набирается на [timespan]):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
2
ответ дан js2010 22 August 2018 в 22:23
поделиться

Скрипт Esperento57 не работает в старых версиях PowerShell. В этом примере:

Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {($_.LastwriteTime -lt  (Get-Date).AddDays(-15) ) -and (! $_.PSIsContainer)} | select name| Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue
5
ответ дан KERR 22 August 2018 в 22:23
поделиться
  • 1
    Вы также можете удалить каталог. – Esperento57 24 November 2017 в 08:04
  • 2
    Я обновил свой ответ, чтобы исключить каталоги сейчас, спасибо. – KERR 29 November 2017 в 00:45

Эти ответы будут удалять только файлы (что, по общему признанию, это то, что находится в заголовке этого сообщения), но вот какой-то код, который сначала удалит все файлы старше 15 дней, а затем рекурсивно удалит все пустые каталоги, которые могут остались. Мой код также использует параметр -Force для удаления скрытых и файлов только для чтения. Кроме того, я решил не использовать псевдонимы, поскольку OP является новым для PowerShell и может не понимать, что gci, ?, % и т. Д.

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

И, конечно, если вы хотите увидеть, какие файлы / папки будут удалены до их фактического удаления, вы можете просто добавить переключатель -WhatIf в вызов командлета Remove-Item в конце обеих строк.

Код, показанный здесь совместим с PowerShell v2.0, но я также показываю этот код и более быстрый код PowerShell v3.0 как удобные функции повторного использования в моем блоге .

242
ответ дан Michael 22 August 2018 в 22:23
поделиться
  • 1
    Спасибо, что не использовали псевдонимы. Для кого-то, кто является новым для powershell и нашел этот пост в поиске Google, я считаю ваш ответ лучшим. – Geoff Dawdy 22 October 2013 в 22:11
  • 2
    что, похоже, работало, спасибо! – Anders K. 15 May 2014 в 07:24
  • 3
    Если файлы могут быть использованы, также стоит добавить & quot; -ErrorAction SilentlyContinue & quot; к команде RemoveItem. – Kevin Owen 30 July 2015 в 10:21
  • 4
    Благодаря! Я использую $ _. LastwriteTime вместо $ _. CreationTime – Lauri Lubi 3 December 2015 в 11:31
  • 5
    Вторая команда в этом скрипте всегда получает ошибку, которая Get-ChildItem не может найти часть пути. Он получает исключение, не найденное в каталоге. Тем не менее он удаляет пустые папки без проблем. Не уверен, почему он получает ошибку, несмотря на работу. – Nathan McKaskle 22 August 2016 в 18:12
#----- Define parameters -----#
#----- Get current date ----#
$Now = Get-Date
$Days = "15" #----- define amount of days ----#
$Targetfolder = "C:\Logs" #----- define folder where files are located ----#
$Extension = "*.log" #----- define extension ----#
$Lastwrite = $Now.AddDays(-$Days)

#----- Get files based on lastwrite filter and specified folder ---#
$Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"}

foreach ($File in $Files)
{
    if ($File -ne $Null)
    {
        write-host "Deleting File $File" backgroundcolor "DarkRed"
        Remove-item $File.Fullname | out-null
    }
    else
        write-host "No more files to delete" -forgroundcolor "Green"
    }
}
-1
ответ дан Peter Mortensen 22 August 2018 в 22:23
поделиться
  • 1
    Что не так с этим ответом? Почему вниз вниз? – user3282276 24 February 2015 в 23:00
  • 2
    Он будет работать нормально, но не использует функции PowerShell. – PseudoToad 6 March 2015 в 19:46
  • 3
    Кроме того, он никогда не достигнет оператора else , потому что если $Files пуст, он не будет вводить оператор foreach . Вы должны поместить foreach в оператор if . – Dieter 26 May 2015 в 08:16
  • 4
    @mati на самом деле может достичь выражения else. У нас есть аналогичный цикл, основанный на списке файлов, и он регулярно входит в цикл for с переменной $ File как null – BeowulfNode42 29 June 2015 в 08:53
  • 5
    Действительно ли этот код компилируется? – Peter Mortensen 11 November 2015 в 15:50

Попробуйте следующее:

dir C:\PURGE -recurse | 
where { ((get-date)-$_.creationTime).days -gt 15 } | 
remove-item -force
6
ответ дан Roland Jansen 22 August 2018 в 22:23
поделиться
  • 1
    Я считаю, что последний -recurse слишком много, нет? Список каталогов рекурсивно, удаление элемента не должно быть связано с включенными дочерними элементами, правильно? – Joost 31 July 2013 в 01:00
  • 2
    – RayofCommand 5 December 2013 в 17:28
  • 3
    Если каталог, с которым вы работаете, состоит из двух каталогов, то необходима вторая -recurse. – Bryan S. 20 November 2015 в 19:45

В основном, вы перебираете файлы по заданному пути, вычитаете CreationTime каждого файла, найденного с текущего времени, и сравниваете его с Days свойством результата. Переключатель -WhatIf скажет вам, что произойдет, не удалив фактически файлы (какие файлы будут удалены), удалите переключатель, чтобы фактически удалить файлы:

$old = 15
$now = Get-Date

Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf
13
ответ дан StackzOfZtuff 22 August 2018 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: