source

스케줄링된 작업으로 실행할 때 PowerShell 스크립트가 파일에 액세스할 수 없음

nicesource 2023. 6. 18. 16:06
반응형

스케줄링된 작업으로 실행할 때 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 포럼에서(자동화PowerShellExcel 문제를 통해)

위의 솔루션은 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

반응형