Usando o Powershell v2.0, desejo excluir todos os arquivos com mais de X dias:
$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;
}
No entanto, quando $ backups está vazio, recebo: Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
Eu tentei:
- Protegendo o foreach com
if (!$backups)
- Protegendo o item de remoção com
if (Test-Path $file -PathType Leaf)
- Protegendo o item de remoção com
if ([IO.File]::Exists($file.FullName) -ne $true)
Nenhuma delas parece funcionar, e se a maneira recomendada de impedir que um loop foreach seja inserido se a lista estiver vazia?
powershell
SteB
fonte
fonte
Respostas:
Com o Powershell 3, a
foreach
instrução não repete$null
e o problema descrito pelo OP não ocorre mais.Na postagem do blog do Windows PowerShell, novos recursos de idioma da V3 :
Para o PowerShell,
$PSVersionTable.PSVersion.Major -le 2
consulte o seguinte para obter a resposta original.Você tem duas opções, eu uso principalmente a segunda.
Verifique se
$backups
não$null
. Um simplesIf
passo a passo pode verificar se não há$null
Ou
Inicialize
$backups
como uma matriz nula. Isso evita a ambiguidade do problema "iterar matriz vazia" sobre a qual você perguntou na sua última pergunta .Não foi possível fornecer um exemplo de integração do seu código. Observe o
Get-ChildItem
cmdlet agrupado na matriz. Isso também funcionaria com funções que poderiam retornar a$null
.fonte
Sei que essa é uma postagem antiga, mas gostaria de salientar que o cmdlet ForEach-Object não sofre o mesmo problema que o uso da palavra-chave ForEach. Assim, você pode canalizar os resultados do DIR para o ForEach e apenas referenciar o arquivo usando $ _, como:
Você pode realmente encaminhar o próprio comando Dir através do canal e evitar atribuir a variável como:
Eu adicionei quebras de linha para facilitar a leitura.
Entendo que algumas pessoas gostam de ForEach / In para facilitar a leitura. Às vezes, o objeto ForEach pode ficar um pouco peludo, principalmente se você estiver aninhando, pois fica difícil seguir a referência $ _. De qualquer forma, para uma operação pequena como essa, é perfeito. Muitas pessoas também afirmam que é mais rápido, no entanto, descobri que isso é apenas um pouco.
fonte
foreach
instrução não entra mais$null
, portanto, o erro descrito pelo OP não ocorre mais. Consulte a seção "A declaração ForEach não itera mais de $ null" na postagem do blog Powershell, Novos recursos de idioma da V3 .Eu desenvolvi uma solução executando a consulta duas vezes, uma vez para obter os arquivos e outra para contar os arquivos lançando o get-ChilItem para retornar uma matriz (convertendo $ backups como uma matriz depois que o fato parece não funcionar) .
Pelo menos, funciona como esperado (o desempenho não deve ser o problema, pois nunca haverá mais de uma dúzia de arquivos); se alguém souber de uma solução de consulta única, poste-a.
fonte
Use o seguinte para avaliar se a matriz possui algum conteúdo:
Se a variável não existir, o Powershell simplesmente a avaliará como falsa, portanto, não é necessário verificar se ela existe.
fonte