2016-12-16 117 views
0

我想写一个脚本,收集服务器名称列表,然后遍历每个服务器名称,并抓住第二个目录中的最新文件夹,重命名它,并将其复制到另一台服务器。我在一个命令中遇到了麻烦,我不知道什么是分离它并使其正常工作的最佳方式。在尝试不同的事情时我会遇到错误,主要原因是“rename-item:无法评估参数”NewName“,因为它的参数被指定为脚本块并且没有输入”。下面是导致此错误的代码片段:Powershell:Get-ChildItem - 管道重命名 - 项目和复制 - 项目

$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" } 

另一个是“不能绑定参数参数‘路径’,因为它是空”。这里是导致此错误的代码:

$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" } } 

我觉得我非常接近,只是看不到东西。非常感谢任何帮助,非常感谢。祝你有美好的一天。

编辑,包括NEWEST CODE:

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" } 

CODE FOR最新评论:

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" } 

回答

1

原来这竟然是比我想象的还要好,诀窍在于重命名,项目似乎基本上消耗了管道化对象没有给你一个机会,使用该对象在随后的域名(更困难使用脚本块也不甚理想,更容易使用一个简单的concatted字符串),所以你需要就到你的循环Rename-Item部分改变稍微

Rename-Item -Path $_.FullName -NewName ("$serverName" + "_" + $_.Name) 

为prageeth建议你可以让他们的语法变化但他们是不需要的,并增加歧义(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" } 
+0

我认为这是非常接近钉钉!它不完成的唯一部分是文件副本。它不会出错......它只是不复制文件。 :) 有任何想法吗?谢谢! – LilithGoddess

+0

哦,哇,没有看到管道是如何在那里建立的,问题是'rename-item'没有将对象传递给'Copy-Item',你可以克服2种方法,或者添加一个' -PassThru'切换到你的'Rename-Item'或者只是把你的'|'改成''',然后将拷贝作为第二个命令在foreach中执行而不是管道元素 –

+0

GETTING SO CLOSE !! !现在看起来它正在重命名该文件,但在重命名之前尝试复制该文件? (找不到路径xxxxx,因为它不存在) - 当我查看文件夹时,它已被正确地重命名,但错误实际上是在文件夹被重命名之前调出该文件夹...是否有意义? – LilithGoddess

0

编辑:

随着用户迈克提到,看来,管理共享不需要$才能逃脱。真正的问题是rename-Item cmdlet缺少-Path参数。感谢你带来了迈克!

但是我仍然建议删除多余的$($ serverName)以减少歧义。

试试这个!

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" } } 
+0

感谢您的回复。我做了建议的编辑并重新编写了我的代码,它仍然给我提供了同样的错误:“无法评估参数'NewName',因为它的参数被指定为脚本块,并且没有输入。如果没有输入,则无法评估脚本块。 – LilithGoddess

+0

是需要''路径'是必要的,但你也不能使用scriptblock来建立名称,而不做一些奇怪的点源只是不需要。并且我个人认为'$($ servername)'不像'$ servername'那样含糊不清,但是在这种情况下这并不是真正的相关性。 –

0

在这样的情况下始终是最好的分析命令输出第一...

# Rename doesn't output anything by default 
Rename-Item ToBeRenamed.txt Renamed.txt 

# For most commands with that default behaviour, you can use -PassThru to force output 
Rename-Item ToBeRenamed.txt Renamed.txt -PassThru 

# Once we have something in the pipeline, we can pipe result to Copy-Item 
Rename-Item ToBeRenamed.txt Renamed.txt -PassThru | Copy-Item -Destination C:\temp 
ls C:\temp\Renamed.txt 

我会建议避免这里的foreach对象 - 这是不是真的需要。你只需要控制命令的输出,就是这样。