2017-02-17 22 views
0

リモートサーバーから実行するPowerShellスクリプトがあります。スクリプトの目的は、次の操作を行うことです。ユーザーがログオフしたときにタスクスケジューラからPowershellスクリプトを実行する

  1. コピー、リモートサーバー
  2. Excelファイルを開き、マクロを実行するために、マップされたドライブからExcelファイルその
  3. マクロコピーAccessテーブルそれは、リモートサーバー上だとExcelファイルにそれを貼り付け、その後、いくつかのデータ操作
  4. は、Excelファイルを保存し、それを閉じてから、コピー

今戻ってマップされたドライブに、I私はテストしている私のローカルマシン上のtは、マップされたドライブからCドライブにE​​xcelファイルをコピーしてから、ローカルマシン上の場所から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 $_ } 

私は夜中に1日1回実行するスクリプトを持っている必要がありますので、私はそれスケジュールされたタスク作りに取り組んでいます。私が最初に次の情報を 'アクション' を設定します

プログラム/スクリプト: 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

関連する問題