2017-02-17 8 views
0

У меня есть сценарий powershell, который я намереваюсь запускать с удаленного сервера. Цель скрипта сделать следующее:Запуск сценария Powershell из планировщика заданий при выходе пользователя из системы

  1. Скопируйте файл Excel с помощью сетевого диска на удаленный сервер
  2. Откройте файл Excel и запустить макрос, который
  3. Макрос копирует таблицу Access что находится на удаленном сервере и вставляет его в файл Excel, а затем делает некоторые манипуляции с данными
  4. Сохраняет файл Excel, закрывает его, а затем копирует его обратно на ленточном накопителе

прямо сейчас, я тестирование i t на моей локальной машине, поэтому он копирует файл Excel из сопоставленного диска на мой диск C, а затем захватывает таблицу Access из местоположения на моем локальном компьютере. Он отлично работает, когда я запускаю его из Powershell. Вот код:

# collect excel process ids before and after new excel background process is 
# started 
$priorExcelProcesses = Get-Process -name "*Excel*" | % { $_.Id } 
$Excel = New-Object -ComObject Excel.Application 
$postExcelProcesses = Get-Process -name "*Excel*" | % { $_.Id } 

#run program 
$folderPath = "my folder goes here" 
$filePath = "my folder gooes here\filename.xlsm" 
$tempPath = "C:\Users\Public" 
$tempFile = "C:\Users\Public\filename.xlsm" 

#copy file from I drive to remote desktop 
Copy-Item -Path $filePath -Destination $tempPath 

#create Excel variables 
$excel = new-object -comobject excel.application 
$excel.visible = $False 
$excelFiles = Get-ChildItem -Path $tempPath -Include *.xls, *xlsm -Recurse 

#open excel application and run routine 
Foreach($file in $excelFiles) 
{ 
    $workbook = $excel.workbooks.open($tempFile) 
    $worksheet = $workbook.worksheets.item(1) 
    $excel.Run("getAccessData") 
    $workbook.save() 
    $workbook.close() 
} 

#copy file from remote desktop back onto I drive 
Copy-Item -Path $tempFile -Destination $folderPath 

# try to gently quit 
$Excel.Quit() 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) 

# otherwise allow stop-process to clean up 
$postExcelProcesses | ? { $priorExcelProcesses -eq $null -or $priorExcelProcesses -notcontains $_ } | % { Stop-Process -Id $_ } 

Мне нужно, чтобы скрипт запустить один раз в день в середине ночи, так что я работаю над тем, чтобы запланированное задание. Я первый создал 'действие' со следующей информацией:

Программа/Script: C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe Добавить аргументы (необязательно): -NoProfile -ExecutionPolicy Bypass -file «C: \ Users \ nelsonth \ emsUpdateDesktop.ps1»

Теперь, если я запустил эту задачу, в то время как для параметра безопасности задано значение «Запускать только при входе пользователя» и «Скрытый ", то задача выполняется отлично.

Так как это будет работать с удаленного рабочего стола посреди ночи, мне нужен сценарий для запуска, пока я выхожу из системы. Но когда я выбрал «Запустить, был ли пользователь включен или нет» и «Запустить с наивысшими привилегиями», сценарий больше не запускается.

Мне нужно, чтобы это работало, может ли кто-нибудь помочь мне устранить эту проблему?

+0

Я последовал шаги в ответ на другой вопрос, и он Бесполезный Ничего не изменишь. – tjnel

+0

Я только что подтвердил, что после ответа на связанный с ним вопрос я получил следующее уведомление при открытии Excel: «Нельзя использовать привязку и вложение объектов». После этого приложение не смогло открыть какой-либо из моих существующих файлов Excel. Мне пришлось отменить предложенное изменение, чтобы снова использовать Excel, поэтому я не буду продолжать этот путь дальше. – tjnel

ответ

0

При запуске как «Запустить, был ли пользователь включен или нет», вашему скрипту PowerShell, скорее всего, придется вручную сопоставить диски или получить доступ к файлу через UNC-путь.

Попробуйте добавить что-то вроде следующего в верхней части сценария, проверка на букву диска, то отображение его, если не найден:

if (-Not (Test-Path 'X:\')) {New-PSDrive -Name "X" -PSProvider FileSystem -Root "\\MyServer\MyShare"} 
+0

Хорошо, похоже, это сработало. Мне пришлось изменить код Excel VBA, чтобы ссылаться на сопоставленный диск по его полному имени, а не на местоположение диска. Как только я это сделал, он работал, был ли я зарегистрирован или нет. – tjnel

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