【发布时间】: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