【问题标题】:Powershell: Copy-Item not working when in ForEach loopPowershell:在 ForEach 循环中复制项目不起作用
【发布时间】:2016-12-21 01:56:45
【问题描述】:

我在下面包含的脚本需要完成以下任务。它需要从 AD 中获取服务器列表,然后遍历每个服务器名称,并获取目录中最新文件夹中的第二个,重命名,然后将其复制到另一台服务器。

当我在 foreach 循环中使用 Copy-Item 命令时它不起作用,如下所示:

#gathering server names
$serverList = (Get-ADComputer -Filter "Name -like 'Q0*00*'" -SearchBase "OU=MPOS,OU=Prod,OU=POS,DC=N,DC=NET").name | Sort-Object | Out-File C:\Temp\MPOS\MPOSServers.txt
$serverListPath = "C:\Temp\MPOS\MPOSServers.txt"

#Retrieve a list of MPOS Print servers from text file and set to $serverNames
$serverNames = Get-Content -Path $serverListPath

#Iterate through each of the server names
foreach ($serverName in $serverNames) {

$reportServer = "a03"

Get-ChildItem "\\$($serverName)\d$\MPosLogs\Device" | 
Where { $_.PSIsContainer } | 
Sort CreationTime -Descending | 
Select -Skip 1 |
Select -First 1 |
ForEach-Object {

    Rename-Item -Path $_.FullName -NewName ("$serverName" + "_" + $_.Name) -PassThru |
    Copy-Item -Destination "\\$($serverName)\c$\temp\MPOS\Logs"

    }

}

但是,如果我在 ForEach 循环之外对其进行测试,它可以正常工作,如下所示:

Get-ChildItem "\\$($serverName)\d$\MPosLogs\Device" | 
Where { $_.PSIsContainer } | 
Sort CreationTime -Descending | 
Select -Skip 1 |
Select -First 1 |
ForEach-Object {

    Rename-Item -Path $_.FullName -NewName ("$serverName" + "_" + $_.Name) -PassThru |
    Copy-Item -Destination "\\$($serverName)\c$\temp\MPOS\Logs"

}

关于为什么它不能在完整脚本中工作的任何想法?当我测试它时,我没有改变任何东西,我只是运行上面的命令,而不是在 ForEach 循环中。它正在完成除文件夹副本之外的其余任务。仅当我在单个服务器上的 ForEach 循环之外对其进行测试时,该文件夹副本才有效。

当我说“它不起作用”时,没有错误或类似的东西。它根本不是复制文件夹。

谢谢! :) LG

【问题讨论】:

  • 大声笑我记得这段代码:) $ServerListPath 指向一个有效的文件,对吧?你能显示write-host $servernames 的结果吗?我怀疑该数组的生成方式存在一些问题
  • @MikeGaruccio 你好 :) 是的,我想为一个新问题开始一个新线程。 Write-Host $serverNames 以这种格式列出所有服务器名称:Q0001001 Q0002001 Q0003001 - 等等。
  • 嗯,都在一行? $serverNames.Count 显示什么?
  • 评论没有换行符,所以服务器列表可以在不同的行...
  • 哦,对了,忘记了这一点,并且更多地考虑它会由于 GCI 上的服务器名称无效而产生某种错误。但我看不到任何其他可能被循环@LilithGoddess 你可以在Foreach 循环中添加Write-Host $servername 吗?想要确保您实际进入循环,如果是这样,我们可以添加更多日志记录,直到我们找出它的中断位置。

标签: powershell


【解决方案1】:

@MikeGaruccio 非常尴尬。我想我只是盯着这个脚本太久了,并没有意识到我实际上并没有将文件夹复制到 $reportServer - 这是你问的一件好事!这绝对很重要。现在一切都很好,在将最终的 $serverName 更改为实际读取 $reportServer 之后。谢谢你,很抱歉浪费你的时间......我非常感谢你的帮助。

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多