2014-02-17 42 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 

如果我在交互式shell中設置變量,我可以運行copy-item cmd而不會出現任何問題。如果我使用相同的參數而不是變量,我可以複製這些文件。只有在腳本中運行時纔會發生故障。

我試過在不同的帳戶下運行,所有這些都是管理員。我改變了-LiteralPath的-path參數。我已經添加了輸出以確保該對象沒有改變其值並且一切看起來都很好。失敗的服務器可能具有不同的語言設置,因爲它們不在美國,但該變量看起來不錯。只有Windows 2003服務器有問題,而不是2008服務器的問題。

我出來的想法,開放的建議。

下面是該腳本的確切功能與調用參數

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驗證目標文件路徑的存在,稱Copy-Item過嗎?

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