2009-12-14 6 views
4

나는 초보자이며 PowerShell입니다.이 스크립트를 작성하고 싶습니다. 각 줄마다 경로 나 확장명이없는 파일 이름의 일부인 텍스트 파일이 있습니다. 한 줄짜리 파일의 각 줄을 반복하고 싶습니다. (gc - Get-Content, 오른쪽?), 줄 내용을 가져 와서 소스 경로를 만듭니다 (네트워크 드라이브와 확장은 정적입니다). 대상 경로를 선택한 다음 각 파일을 복사합니다. 내 파일 내용은 다음과 같이이다 :PowerShell : 텍스트 파일의 행을 읽고 소스 및 대상 파일 이름을 구성한 다음 파일을 복사하십시오.

\\server\share 

그리고 내 대상 폴더는 다음과 같습니다 :

12345678 
98765432 
32145698 
12365782 

그리고 내 소스 폴더이 같은 UNC 경로

c:\temp\files 

내가하고 싶은 이 DOS 명령에 해당하는 파일의 각 줄에있는 텍스트로 $_을 사용하십시오.

copy \\server\share\$_.ext c:\temp\files\$_.ext 

은 내가 파일의 각 행에 액세스 할 수 gc$_을 사용할 수 있습니다 확신 해요, 내가 파일을 복사 cp를 사용할 필요가 있지만 소스 및 대상 파일 이름을 구성하는 데 문제가 있습니다.

답변

5

다음과 같이 해보십시오

gc theFileName | 
    %{ "{0}.ext" -f $_ } | 
    %{ copy "\\server\share\$_" "c:\temp\files\$_" } 

실제로 한 줄에 수행 할 수 있지만, 더 나은

+0

우수. 매우 감사합니다! @ JaredPar, 내 개인 Powershell 코치. –

+1

'gc theFileName | % {cp '\\ server \ share \ $ _. ext' 'C : \ temp \ files'}'? 아니면 그 betoo 짧을까요? :-) – Joey

+0

@Johannes, 나는 * 작동한다고 생각하지만 문자열 내에서 때때로 파싱 규칙을 잊어 버렸고 .ext가 제대로 해석되는지 확실하지 않았습니다. 따라서 안전한 경로 – JaredPar

4

복사 품목이 직접 스크립트 블록을 취할 수이 답변 : 여러 행으로 formmated 보인다 데 Foreach-개체 단계 그래서 경우는 불필요하다 : 당신이 그것을 작동 만족하면

gc theFileName | cpi -l {"\\server\share\$_.exe"} c:\temp\files -whatif 

-WhatIf 매개 변수를 제거합니다. -l은 -LiteralPath의 약자로 PowerShell이 ​​사용중인 매개 변수를 결정하는 데 도움이됩니다. 와일드 카드 문자가 globbed되지 않도록 여기에 리터럴 경로를 사용하는 것이 더 좋습니다 (원하는 경우가 아니라면 -path를 사용하십시오).

기본적으로 파이프 라인 바인딩 된 매개 변수는 scriptblocks를 통해 지정 될 수 있으며 PowerShell은 스크립트 블록의 결과를 파이프 라인 바인딩 매개 변수에 의해 예상되는 형식으로 확인하려고 시도합니다.

+0

Copy-Item의 일반적인 기능이나 멋진 기능은 사실입니까? –

+1

파이프 라인에 바인딩 된 모든 매개 변수에 대해 작동합니다. PowerShell 매개 변수 파서/바인더는 물론 매개 변수 유형이 [scriptblock] 인 경우를 제외하고는 파이프 라인에 바인딩 된 매개 변수에 대한 스크립트 블록을 평가합니다. –

+0

실제로 ValueFromPipelineByPropertyName 매개 변수에서도 작동합니다. –

관련 문제