2016-12-16 90 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對象 - 這是不是真的需要。你只需要控制命令的輸出,就是這樣。