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