2016-05-18 29 views
0

Я пытаюсь написать следующий скрипт, который проверяет папку для набора файлов, если они существуют, переместите их в папку «архив». Если они этого не делают, напишите сообщение об ошибке на экран и в файл журнала.else не выполняется в пределах foreach

Файлы перемещаются в порядке, поэтому первая часть IF работает правильно, но если нет файлов для перемещения, другое должно вставлять и выводить ошибку .... но это не так.

variables.ps1:

#----- define parameters -----# 
#----- Treat All Errors as Terminating -----# 
$ErrorActionPreference = "Stop" 
#----- Set count to 0 -----# 
$count = 0 
#----- get current date ----# 
$Now = Get-Date 
#----- define amount of days ----# 
$Days = "0" 
#----- define folder where files are located ----# 
$SourceFolder = "C:\HG1\Test\Files" 
#----- define folder where files are to be moved to ----# 
$DestFolder = "C:\HG1\Test\Files\Archive" 
#----- define folder where files are to be moved to ----# 
$LogPath = "C:\HG1\archive.log" 
#----- define extension ----# 
$Extension = "*.log" 
#----- define LastWriteTime parameter based on $Days ---# 
$LastWrite = $Now.AddDays(-$Days) 

#----- get files based on lastwrite filter and specified folder ---# 
$Files = Get-Childitem $SourceFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"} 

archive_files.ps1

#----- Call variables file variables.ps1 - MUST BE IN SAME LOCATION AS SCRIPT ----# 
. ./variables.ps1 

foreach ($File in $Files) 
    { 
    if ($File -ne $NULL) 
     { 
     move-item -path $File.FullName -destination $DestFolder 
     Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t INFO: Archived File $File") 
     } 
    else 
     { 
     write-host "ERROR: No files to archive" -ForegroundColor "Red" 
     Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t ERROR: No files to archive") 
     } 
    } 
Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t INFO: ***Archiving script completed successfully***") 

Любая помощь будет принята с благодарностью.

+0

'$ File 'никогда не будет нулевым, по крайней мере, это будет строка. Вы можете проверить существующие файлы с помощью 'Test-Path', как показано в этом вопросе: http://stackoverflow.com/questions/1732250/check-if-file-exist-and-run-a-batch-file-in -powershell –

+0

Если в '$ Files' нет файлов, тогда' foreach' просто пропускается. 'Else' никогда не должен запускаться с вашим кодом. – Enigmativity

+0

Хотите ли вы изучить все подпапки '$ sourcefolder' и выполнить действие в этих папках на основе наличия файлов .log? – Matt

ответ

0
#----- Call variables file variables.ps1 - MUST BE IN SAME LOCATION AS SCRIPT ----# 
. ./variables.ps1 


if ($File) 
    { 
    foreach ($File in $Files) 
    { 
     move-item -path $File.FullName -destination $DestFolder 
     Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t INFO: Archived File $File") 
    } 

    } 
else 
    { 
    write-host "ERROR: No files to archive" -ForegroundColor "Red" 
    Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t ERROR: No files to archive") 
    } 

Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t INFO: ***Archive script completed successfully***") 

здесь,

  • Foreach каждый не будет обрабатывать за $ нулевое значение поэтому включить foreach, если значение не является нулевым
  • , если не вступит в $ нулевое значение так "-ne $ нуль" не нужно

надеется, что это работает для вас,

С уважением,

Kvprasoon

+0

Отлично, исправлено. Единственное, что мне пришлось изменить, это «if ($ file)» нужно было бы «if ($ files)». Спасибо! – dankellys

0

Вы должны использовать Test-Path командлет, чтобы проверить, существует ли файл:

foreach ($File in $Files) 
    { 
    if (Test-Path $File) 
     { 
     move-item -path $File.FullName -destination $DestFolder 
     Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t INFO: Archived File $File") 
     } 
    else 
     { 
     write-host "ERROR: No files to archive" -ForegroundColor "Red" 
     Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t ERROR: No files to archive") 
     } 
    } 
Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t INFO: ***Archiving script completed successfully***") 
+0

Я не думаю, что это намерение кода OP. Я думаю, он хочет проверить, является ли '$ Files' пустым, а не если каждый' $ File' существует. – Enigmativity

+0

Возможно, вы правы. Тогда нам нужен весь скрипт ...Во всяком случае, все еще хочу показать ему, что он может использовать командлет «Test-Path», чтобы проверить, существует ли файл –

+0

. Я думаю, что сообщение об ошибке «ERROR: Нет файлов для архивации» - это раздача на этом. – Enigmativity

0

Вы получили эту логику назад там.

Каждый $File в $Files всегда будет что-то , но сама $Files коллекция может быть пустым:

if(-not $Files) 
{ 
    foreach($File in $Files) 
    { 
     Move-Item -Path $File.FullName -Destination $DestFolder 
     Add-Content $LogPath -Value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t INFO: Archived File $File") 
    } 
} 
else 
{ 
    Write-Host "ERROR: No files to archive" -ForegroundColor "Red" 
    Add-Content $LogPath -Value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t ERROR: No files to archive") 
} 

Add-Content $LogPath -value ("$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) `t INFO: ***Archiving script completed successfully***") 
+0

Спасибо, но все равно получаю ту же проблему, когда файлы * .log обрабатываются. Остальное игнорируется, и скрипт заканчивается только после записи «2016-05-18 15:58:21 \t INFO: *** Скрипт архивирования успешно завершен ***» в файл журнала. Никаких признаков сообщения «ОШИБКА: Нет файлов в архив» – dankellys

Смежные вопросы