我正在尝试编写一个脚本,该脚本收集服务器名称列表,然后遍历每个服务器名称,并将第二个服务器名称抓取到目录中的最新文件夹,将其重命名,然后将其复制到另一台服务器。我很难让它在一个命令中全部工作,并且我不确定将其拆分并使其正常工作的最佳方法是什么。尝试其他操作时出现错误,主要是“重命名项目:无法评估参数” NewName”,因为其参数被指定为脚本块且没有输入”。这是导致此错误的代码段:
$serverNames = Get-Content -Path "C:\servers.txt"
foreach ($serverName in $ServerNames) {
$reportServer = "a56741035"
Get-ChildItem "\\$($serverName)\d$\mposlogs\device" | where { $_.PSIsContainer } | Sort CreationTime -Descending | Select -Skip 1 | Select -First 1 | Rename-Item -NewName { "$serverName" + "_" + $_.Name } | Copy-Item $_.FullName -Destination "\\$($reportServer)\c$\temp\mpos\logs" }
另一个是“无法将参数绑定到参数'Path',因为它为空”。这是导致此错误的代码:
$serverNames = Get-Content -Path "C:\servers.txt"
foreach ($serverName in $ServerNames) {
$reportServer = "a56741035"
Get-ChildItem "\\$($serverName)\d$\mposlogs\device" | where { $_.PSIsContainer } | Sort CreationTime -Descending | Select -Skip 1 | Select -First 1 | ForEach-Object { Rename-Item -NewName { "$serverName" + "_" + $_.Name } | Copy-Item $_.FullName -Destination "\\$($reportServer)\c$\temp\mpos\logs" } }
我觉得我很亲密,只是看不到东西。非常感谢您的协助,非常感谢。祝你有美好的一天。
编辑以包括最新代码:
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 ) ; Copy-Item $_.FullName -Destination "\\$($reportServer)\c$\temp\mpos\logs" }
最新评论代码:
Get-Child-Item "\\$serverName\d$\mposlogs\device" | where {$_.PSIsContainer} | Sort CreationTime -Descending | Select -Skip 1 | Select -First 1 | ForEach-Object { Rename-Item -Path $_.FullName -NewName ( "$serverName" + "" + $.Name ) ; Copy-Item ( "$serverName" + "" + $.Name ) -Destination "\\$reportServer\c$\temp\mpos\logs" }
因此,事实证明这比我想象的要困难得多,诀窍在于Rename-Item似乎基本上消耗了流水线对象,而没有给您机会在后续名称中使用该对象(使用脚本块也并非如此)理想,使用简单的conatted字符串会容易得多),因此您需要将Rename-Item
循环的部分稍微更改为
Rename-Item -Path $_.FullName -NewName ("$serverName" + "_" + $_.Name)
至于语法变化的建议,建议您可以制作它们但不需要,并且imo会增加歧义性(Get-Childitem不需要转义字符来访问管理共享,即使没有使用$($)语法也没有错访问媒体资源)。
编辑
在评论中稍作修改后,这里是完整GCI管道的更新版本。我在我的环境中成功测试了它,所以用手指交叉它可以为您工作。请让我知道其中的任何部分是否有意义。
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 "\\$reportServer\c$\temp\mpos\logs" }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句