스케줄링된 작업으로 실행할 때 PowerShell 스크립트가 파일에 액세스할 수 없음
내 Powershell (2.0) 스크립트에는 다음 코드 스니펫이 있습니다.
$fileName = "c:\reports\1.xlsx"
$xl = new-object -comobject excel.application
$xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault
$xl.displayalerts = $false
$workbook = $xl.workbooks.open($fileName)
#Code to manipulate a worksheet
$workbook.SaveAs($fileName, $xlformat)
$xl.quit()
$error | out-file c:\reports\error.txt
Powershell 명령 프롬프트에서 이 스크립트를 문제 없이 실행할 수 있습니다.스프레드시트가 업데이트되고 오류가 발생합니다.txt가 비어 있습니다.그러나 작업 스케줄러에서 작업으로 실행하면 첫 번째 줄에 오류가 발생합니다.
"1" 인수를 사용하여 "Open"을 호출하는 중 예외 발생: "Microsoft Office Excel은 'C:\reports\1.xlsx' 파일에 액세스할 수 없습니다.몇 가지 가능한 이유가 있습니다.파일 이름 또는 경로가 없습니다.다른 프로그램에서 파일을 사용하고 있습니다.저장하려는 워크북의 이름이 현재 열려 있는 워크북의 이름과 같습니다.
Powershell 명령 프롬프트에서 스크립트를 실행하는 데 사용하는 인증 정보로 태스크를 실행합니다.스크립트를 수동으로 실행하면 스프레드시트를 문제 없이 열고 업데이트하고 저장할 수 있습니다.작업 스케줄러에서 실행하면 스프레드시트에 액세스할 수 없습니다.
문제의 파일은 모든 사용자가 읽을 수 있고 쓸 수 있습니다.동일한 자격 증명으로 Excel에서 파일을 열 수 있는지 확인했습니다.스프레드시트를 새로 만들고 $filename으로 이름을 입력하면 동일한 결과가 나옵니다.작업 관리자에 Excel.exe 인스턴스가 없음을 확인했습니다.
이상하게 get-content를 사용하면 문제가 없습니다.또한 스프레드시트를 새로 만들면 문제가 없습니다.
$fileName = "c:\reports\1.xlsx"
$xl = get-content $spreadsheet
$xl = new-object -comobject excel.application
$xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault
$xl.displayalerts = $false
# Commented out $workbook = $xl.workbooks.open($fileName)
$workbook = $xl.workbooks.add()
#Code to manipulate a worksheet
$workbook.SaveAs($fileName, $xlformat)
$xl.quit()
$error | out-file c:\reports\error.txt
그것은 잘 작동합니다.따라서 Get-ChildItem은 문제 없이 파일을 열 수 있습니다.ComObject는 수동으로 실행하면 파일을 열 수 있지만 작업으로 실행하면 열 수 없습니다.
난 어쩔 줄 모르겠다.아이디어 있어요?
Excel에서 버그를 발견한 것 같습니다.
다음 폴더(64비트 윈도우의 경우 2개)를 생성해야 합니다.
(32비트, 항상)
C:\Windows\시스템32\config\systemprofile\데스크탑
(64비트)
C:\Windows\SysWOW64\config\systemprofile\데스크탑
저는 같은 문제를 겪었고 이것이 제가 찾은 유일한 해결책이었습니다.
TechNet 포럼에서(자동화 시 PowerShell 및 Excel 문제를 통해)
위의 솔루션은 SCSM 2012 Scorch 환경에서 작동하지 않았고, 대신 PSExcel(https://github.com/RamblingCookieMonster/PSExcel) 을 사용했는데, 이는 Excel이나 ComObject 설치에 의존하지 않습니다.
@TesellatingHeckler가 제공한 기능을 확장하려면 Powershell(Admin/Elevated)에서 다음 명령을 실행하여 Excel을 열기 전에 폴더를 만들 수 있습니다. 내 스크립트에서 이 문제가 해결되었습니다.
New-Item -ItemType Directory -Force -Path C:\Windows\System32\config\systemprofile\Desktop
if ([Environment]::Is64BitProcess -ne [Environment]::Is64BitOperatingSystem)
{
New-Item -ItemType Directory -Force -Path C:\Windows\SysWOW64\config\systemprofile\Desktop
}
작업 스케줄러 및 Excel의 제한 사항인 것 같아 '사용자가 로그온할 때만'(작업을 실행하는 서비스 계정으로 서버에 로그인한 후 세션 연결을 끊음)을 실행하도록 예약된 작업을 설정해야 했습니다.이것은 꽤 지루한 해결책이지만 효과가 있습니다.
테셀라팅 헤클러가 말한 것을 반복하기 위해.64비트 시스템에서 이 문제를 해결해야 했기 때문에 다음 명령을 사용하여 작업 스케줄러를 통해 PowerShell 스크립트가 작동하게 되었습니다.
New-Item -ItemType Directory -Force -Path C:\Windows\SysWOW64\config\systemprofile\Desktop
언급URL : https://stackoverflow.com/questions/22670344/powershell-script-cannot-access-a-file-when-run-as-a-scheduled-task
'source' 카테고리의 다른 글
C# 및 익명 객체 배열 (0) | 2023.06.18 |
---|---|
부탁한다.RawUr.부탁한다.URL (0) | 2023.06.18 |
Sys.WebForms.페이지 요청 관리자 파서 오류 예외:서버에서 받은 메시지를 구문 분석할 수 없습니다. (0) | 2023.06.18 |
판다 데이터 프레임에서 str.contains 사용 (0) | 2023.06.18 |
엑셀 스크롤을 중간 클릭 없이 원활하게 할 수 있나요? (0) | 2023.06.18 |