2016-12-16 1 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" } 

또 다른입니다 "null의 때문에 인수를 바인딩 할 수 없습니다하는 '경로'매개 변수를"다음은이 오류를 발생시키는 코드이다. 다음은이 오류의 원인이되는 코드입니다.

$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-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 문자열을 사용하는 것이 훨씬 쉽게, 정말 적합하지 않습니다) 그래서 당신은 당신이 그들을 만들 수 있습니다 제안 prageeth 구문의 변화로 지금까지 약간

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

에 루프의 Rename-Item 부분을 변경해야 하지만 그들은 불필요하며 모호성을 증가시킵니다 (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

오 와우, 파이프 라인이 어떻게 설정되었는지는 알지 못했습니다. 이름 바꾸기 항목이 객체를 '복사 항목'으로 전달하지 않는 경우, 두 가지 방법을 극복 할 수 있습니다. -PassThru'를'Rename-Item'으로 바꾸거나'| '를';'로 바꾸면 파이프 라인 요소가 아닌 foreach에서 실행될 두 번째 명령으로 복사본을 처리 할 것입니다 –

+0

너무 가까이에 !! ! 이제 파일의 이름을 바꾸고 있지만 이름을 바꾸기 전에 파일을 복사하려고 시도한 것 같습니다. (존재하지 않기 때문에 경로 xxxxx를 찾을 수 없습니다.) - 그리고 폴더를 보면 이름이 바뀌었지만 이름이 바뀌기 전에 오류가 실제로 폴더를 불러옵니다. – LilithGoddess

0

편집 :

사용자 마이크가 언급 한 바와 같이, 그것은 해당 관리 공유를 표시하지 않는 NEWEST 코멘트에 대한

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 : NEWEST 코드를 포함

EDITED $로 탈출해야합니다. 진짜 문제는 rename-Item cmdlet에 -Path 매개 변수가 누락되었습니다. 마이크를 데려와 줘서 고마워!

그러나 모호성을 줄이기 위해 여분의 $ over $ ($ 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 매개 변수를 평가할 수 없습니다. 인수가 스크립트 블록으로 지정되고 입력이 없기 때문에 매개 변수 'NewName'을 평가할 수 없습니다. 입력없이 스크립트 블록을 평가할 수 없습니다." – LilithGoddess

+0

yea'-Path'가 필요하지만 그냥 필요하지 않은 이상한 도트 소싱을하지 않고도 스크립트 블록을 사용하여 이름을 만들 수는 없습니다. 개인적으로'$ ($ servername)'은'$ servername'보다 덜 모호하지만,이 맥락에서는별로 관련이 없습니다. –

0

은 ... 먼저 명령 출력을 분석하기 위해 항상 내가 여기를 ForEach-객체를 피하는 것이 좋습니다

# 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 

최고입니다 - 그것은 정말 필요한 아니에요.명령으로 출력을 제어하면됩니다.

관련 문제