Powershell无法复制现有文件

时间:2014-02-17 17:29:58

标签: powershell windows-server-2003 powershell-v3.0

上周出现了一个奇怪的问题,无法找到解决方案。我有一个此脚本的修改版本:http://technet.microsoft.com/en-us/magazine/2009.07.heyscriptingguy.aspx在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

1 个答案:

答案 0 :(得分: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中的函数定义之后进行函数调用。如果对函数定义进行了更改,但函数调用发生在定义之前,则在执行脚本时将调用旧函数定义。