Powershell可以';不复制现有文件
上周出现了一个奇怪的问题,无法找到解决方案。我有一个此脚本的修改版本:跨500台服务器运行日志备份。上周,EMEA地区的6台服务器决定不允许复制这些文件 该脚本一次处理一个脚本,使用copy item cmdlet失败。该文件确实存在于远程服务器上。请看下面的输出: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
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的原因。