上周出现了一个奇怪的问题,无法找到解决方案。我有一个此脚本的修改版本: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
答案 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中的函数定义之后进行函数调用。如果对函数定义进行了更改,但函数调用发生在定义之前,则在执行脚本时将调用旧函数定义。