2014-02-17 3 views
0

지난 주 이상한 문제가 발생하여 해결책을 찾을 수 없습니다. 이 스크립트의 수정 된 버전 : http://technet.microsoft.com/en-us/magazine/2009.07.heyscriptingguy.aspx 500 개의 서버에서 로그 백업을 실행합니다. 지난주 EMEA 지역의 6 개 서버는 파일을 복사 할 수 없도록 결정했습니다.Powershell이 ​​기존 파일을 복사 할 수 없습니다.

스크립트는 한 번에 하나의 스크립트를 처리하며 copy-item cmdlet을 사용하여 실패합니다. 파일이 원격 서버에 존재합니다. 아래의 출력에서 ​​봐 :

PS C:\> BackUpAndClearEventLogsDebug.ps1 -computers bud1s001 -LogsArchive "\\srv1s001\d$\Log_Backups\Test" 
+ Processing bud1s001 
This is the Backupeventlogs function and we're about to copy \\bud1s001\c$\Windows\temp\bud1s001\Application.evt 
This is the Copyeventlogs function and we're about to copy \\bud1s001\c$\Windows\temp\bud1s001\Application.evt 
Copy-Item : Cannot find path '\\bud1s001\c$\Windows\temp\bud1s001\Application.evt' because it does not exist. 
At C:\Sched\LOG_BACKUPS\BackUpAndClearEventLogsDebug.ps1:132 char:2 
+  Copy-Item -path $path -dest "$LogsArchive\$folder" 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : ObjectNotFound: (\\bud1s001\c$\W...Application.evt:String)  [Copy-Item], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.CopyItemCommand 

PS C:\> ls \\bud1s001\c$\Windows\temp\bud1s001\Application.evt 
Directory: \\bud1s001\c$\Windows\temp\bud1s001 
Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---   2/17/2014 10:17 AM 5242836 Application.evt 

나는 아무 문제없이 복사 항목 cmd를 실행 할 수있는 대화 형 쉘에서 변수를 설정합니다. 동일한 인수를 사용하지만 변수가 아닌 경우 파일을 복사 할 수 있습니다. 오류가 발생하는 경우에만 스크립트 내에서 실행됩니다.

다른 계정으로 실행 해 보았습니다.이 계정은 모두 관리자입니다. 변경없이 -literalPath에 -path 인수를 변경했습니다. 객체가 값이 변경되지 않고 모든 것이 잘 보이는지 확인하기 위해 출력을 추가했습니다. 실패한 서버는 미국에 있지 않기 때문에 언어 설정이 다를 수 있지만 변수가 잘 보입니다. Windows 2003 서버에만 문제가 있으며 2008 서버에는 문제가 없습니다.

나는 아이디어가 부족합니다.

여기 Copy-Item를 호출하기 전에,

Copy-EventLogsToArchive -path $path -Folder $Folder 

Function Copy-EventLogsToArchive($path, $folder) 
{ 
Write-Host " " 
write-host "This is the Copyeventlogs function and we're about to copy $path" 
Copy-Item -path $path -dest "$LogsArchive\$folder" 
} # end Copy-EventLogsToArchive 

답변

1

는 대상 파일 경로의 존재를 확인하기 위해 Test-Path를 사용하여 시도 되세요 인수 전화와 스크립트의 정확한 기능은 무엇입니까?

Function Copy-EventLogsToArchive 
{ 
    [CmdletBinding()] 
    param ([string] $Path, [string] $folder) 

    Write-Host -Object "`nThis is the Copyeventlogs function and we're about to copy $path"; 
    if (Test-Path -Path $Path) { 
     Copy-Item -Path $Path -Destination "$LogsArchive\$folder"; 
    } 
} # end Copy-EventLogsToArchive 

Copy-EventLogsToArchive -Path $Path -Folder $Folder; 

설명하는 동작이 다소 이상합니다. Copy-Item cmdlet을 우회하여 .NET Framework로 곧바로 파일을 복사하는 방법은 무엇입니까?

[System.IO.File]::Copy($Path, "$LogsArchive\$Folder"); 

사이드 참고 : 당신은 일반적으로 함수가 PowerShell의 함수 정의 후에 호출 놓아야합니다. 함수 정의를 변경했지만 함수 호출이 정의보다 먼저 발생하면 스크립트를 실행할 때 이전 함수 정의가 호출됩니다.

+0

도움을 주셔서 감사합니다. 그 문장에서 Test-Path를 추가 한 후 powershell은 파일을 보지 못했습니다. 함수에 몇 가지 dir 문을 추가하고 마지막으로 찾고 있던 파일이 없다는 것을 알았습니다. 나는 완전한 60 초의 수면을 추가했고 이제는 효과가있다. 이전 WMI BackupEventLog는 명령이 실제로 완료되기 전에 반환 값을 제공합니다. 복사 기능은 파일이 존재하기 전에 또는 백업이 완료되기 전에 파일을 복사하려고 시도합니다. 문제 서버에 대한 if 문을 추가하여 명령이 ReturnValue를 일찍 제공하는 이유를 알아야합니다. – zjherner

관련 문제