Я запускаю простой сценарий для архивирования журналов SMDR с помощью планировщика задач Windows Server 2008 R2. Последняя строка сценария выглядит следующим образом -
dir c:\smdr -Filter *.txt | where-object {$_.basename -eq 'SMDR_Log'} | move-item -destination "c:\smdr\ARCHIVED\SMDR_log_$yesterdayString.txt"
Последний командлет в конвейере правильно переименовывает файл (вставляет дату в имя файла), но не перемещает его в папку В АРХИВЕ папка. Если я запустил эту команду вне Планировщика заданий, все будет отлично работать. Разрешения в папке назначения в порядке.
Я могу придумать множество способов обойти это, но мне бы очень хотелось объяснить, почему файл переименовывается, но остается в текущем каталоге.
XML экспортированного запланированного задания
<?xml version="1.0" encoding="UTF-16"?>
-<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task" version="1.3">
-<RegistrationInfo>
<Date>2014-07-14T09:34:56.2252628</Date>
<Author>DOMAIN\taskadmin</Author>
<Description>Aggregates the individual daily call logs into one master log (.csv format)</Description>
</RegistrationInfo>
-<Triggers>
-<CalendarTrigger>
<StartBoundary>2014-07-15T00:00:01</StartBoundary>
<Enabled>true</Enabled>
-<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
-<Principals>
-<Principal id="Author">
<UserId>DOMAIN\taskadmin</UserId>
<LogonType>S4U</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
-<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
-<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
-<Actions Context="Author">
-<Exec>
<Command>powershell.exe</Command>
<Arguments>-File "C:\scripts\powershell\AvayaCallLogMaintenance\Combine-SMDRLogs.ps1"</Arguments>
</Exec>
</Actions>
</Task>
ОБНОВЛЕНИЕ: я обновил PowerShell с 2.0 до 4.0, и, похоже, он работает в моих тестах. Я позволю ему поработать на ночь, и если это решит проблему, я напишу это в качестве ответа.
ОБНОВЛЕНИЕ 2: PowerShell 4.0 не разрешил его. Я сейчас разбил move-item
командование в отдельные rename-item
а потом move-item
команды. Я позволю ему поработать сегодня вечером и посмотрю, что произойдет.
Я нашел простой обходной путь. Я так и не понял, почему начальная команда не работает.
Обходной путь -
rename-item -path "c:\smdr\smdr_log.txt" -newname "SMDR_log_$yesterdayString.txt"
move-item -Path "c:\smdr\SMDR_log_$yesterdayString.txt" -Destination "C:\smdr\ARCHIVED"