2011-12-30 4 views
0

디렉토리를 구문 분석 할 스크립트를 작성하려고합니다. 이름은 같지만 확장자가 다른 다른 파일 중에서 주어진 확장자의 3 개의 최신 파일을 찾은 다음 출력을 명령에 전달합니다 라인 프로그램.Powershell의 다른 프로그램에 악기를 건네기

지금까지 내가 가진 : 그것은 전체를 많이 중요하지만 그것을 사용하는 프로그램에 따옴표로 인수 2 필요

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3 
\path\program argumentA $file[0] argumentB "argumentC" 
\path\program argumentA $file[1] argumentB "argumentC" 
\path\program argumentA $file[2] argumentB "argumentC" 

확실하지합니다. 결국 출력을 파일에 기록하거나, 보너스 질문에 설명 된 다른 코드 행의 출력을 사용하는 것이 좋습니다.

내가 겪고있는 문제는 $ file [0]을 인수로 사용하면 아무 일도 일어나지 않는다는 것입니다. 변수를 사용하는 대신 $ file [0]에 저장된 파일 이름을 사용하면 실행되지만 인수 B 또는 인수 C는 전달하지 않습니다. cmd에서 실행하면 올바른 결과를 얻을 수 있습니다.

내 질문은 : 변수를 인식하도록 프로그램을 얻으려면 어떻게합니까? 프로그램이 다른 인수를 인식하도록하려면 어떻게합니까?

보너스 질문 : 프로그램에서 파일 목록을 출력합니다. 프로그램의 출력에 나열된 파일을 제외하고 주어진 폴더의 모든 것을 어떻게 삭제합니까?

+0

"한 번에 한 줄만 전달하는 것"에 대해 명확하지 않습니다. 호출 당 4 개의 인수로 프로그램을 세 번 호출합니다. 당신이 원하는 것을 더 구체적으로 할 수 있습니까? –

+0

'$ file [0] .FullName'에 액세스 할 때 어떤 결과가 발생합니까? –

+0

'$ file [0] .fullname'과'$ file [0]'은 동일합니다 :'C : \ file.txt' – Philosophene

답변

0

내가 자주 PowerShell에서 작업을 얻기 위해 "마법"달러 기호 괄호 안의 물건을 포장 할 것을 발견

$($file[0]) 

을보십시오.

+0

여기 엔 불가사의 한 것이 없습니다. 여기에있는 것은 [subexpression] (http://ss64.com/ps/syntax-operators.html)이며이 경우에는 동일한 'System.IO.FileInfo' 객체를 반환합니다. –

+0

약간의 수정, 실제로 그것은'PSCustomObject'를 반환합니다. arcesso의 코드를 처음 읽을 때 첫 번째 줄의 끝을 간과했습니다. 그러나 서브 표현식의 결과는 동일하며 동일한 객체를 반환합니다. –

+1

예 "마법"이라고 적힌 이유가 있습니다. 사실 그들은 마술이라고 제안하는 것이 아니 었습니다. 오히려 그들이 많이 자르는 것처럼 보이는 이런 것들을 고치는 좋은 방법이라고 제안하는 것이 었습니다. –

0

Select-Object으로 파이핑 중이므로 FullName 속성을 선택하면속성이있는 System.Management.Automation.PSCustomObject 유형의 개체가 세 개 있습니다. 이 같은 프로그램에 대한 명령 행 인수로 사용하는 경우는 개체의 FullName 속성에 액세스해야합니다 당신이 Select-Object cmdlet의 전체 이름 속성을 제거하면 파워 쉘은 PSCustomObject를 작성하지 않습니다

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3 
\path\program argumentA $file[0].FullName argumentB "argumentC" 

당신은에 액세스 할 수 있습니다 원래의 System.IO.FileInfo 개체의 모든 속성 및 메서드 실제로이 함께 루프를 사용하는 것이

PsCustomObject

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3 
$file[0] | gm 

System.IO.FileInfo

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select -last 3 
$file[0] | gm 
0

:

는 차이를 볼 수있는 방법입니다 중복을 피하십시오. (그런 식으로 복사 - 붙여 넣기 오류를 피하고 문제를 단순화합니다. 특히 오류 처리 또는 나중에 다른 것을 추가하는 경우). PS 어쨌든 정상적인 개체로 컬렉션을 동일 취급으로 만 1 개체를 선택하면

$files = dir test -Exclude *.md5 | sort -prop LastWriteTime | 
    select fullname -last 3 

foreach ($file in $files) { 
    & \path\program argumentA $file argumentB "argumentC" 
} 

,이 경우에도 작동합니다.