Powershell可以';不复制现有文件

Powershell可以';不复制现有文件,powershell,windows-server-2003,powershell-3.0,Powershell,Windows Server 2003,Powershell 3.0,上周出现了一个奇怪的问题,无法找到解决方案。我有一个此脚本的修改版本:跨500台服务器运行日志备份。上周,EMEA地区的6台服务器决定不允许复制这些文件 该脚本一次处理一个脚本,使用copy item cmdlet失败。该文件确实存在于远程服务器上。请看下面的输出: PS C:\> BackUpAndClearEventLogsDebug.ps1 -computers bud1s001 -LogsArchive "\\srv1s001\d$\Log_Backups\Test" + Proc

上周出现了一个奇怪的问题,无法找到解决方案。我有一个此脚本的修改版本:跨500台服务器运行日志备份。上周,EMEA地区的6台服务器决定不允许复制这些文件

该脚本一次处理一个脚本,使用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。如果我使用相同的参数而不是变量,我可以复制文件。只有在脚本中运行时才会发生故障

我尝试在不同的帐户下运行,所有帐户都是管理员。我将-path参数更改为-LiteralPath,没有任何更改。我添加了输出,以确保对象的值没有改变,并且一切看起来都很好。发生故障的服务器可能有不同的语言设置,因为它们不在美国,但变量看起来不错。仅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

在调用
Copy Item
之前,是否尝试使用
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中的函数定义之后。如果对函数定义进行了更改,但函数调用发生在定义之前,则在执行脚本时将调用旧函数定义。

谢谢您的帮助。在该语句中添加测试路径后,powershell没有看到该文件。我在函数中添加了一些dir语句,最后注意到它要查找的文件不在那里。我增加了60秒的睡眠时间,现在可以正常工作了。上一个WMI BackupEventLog在命令实际完成之前给出了返回值。复制功能尝试在文件存在或备份完成之前复制文件。为出现故障的服务器添加了一个if语句,需要找出命令提前给出ReturnValue的原因。