2011-02-25 6 views
1

명령 줄에서 완벽하게 작동하는 한 줄의 Powershell 명령이 있습니다.간단한 Powershell 명령으로 빌드 후 이벤트에서 Visual Studio 2010이 응답하지 않는다

그러나 VS2010 프로젝트의 빌드 후 명령에 추가하면 실행되지만 Visual Studio가 중단됩니다. Visual Studio가 Powershell 명령이 완료 될 때까지 기다리는 것과 거의 같습니다. 즉 명령 줄은 Enter 키를 눌러 창을 닫거나 뭔가를해야합니다. CPU 사용량이 너무 적으므로.

정상적인 Powershell 명령을 VS2010 포스트 빌드 창 내에서 행복하게 실행하려면 특별한 조치를 취해야합니까?

명령은이 일을 결국

Powershell [io.file]::WriteAllText('C:\test.js', ((gc C:\test.js) -replace 'HELLO','GOODBYE' -join "`r`n")) 

업데이트 : VS 이내에

[io.file]::WriteAllText('C:\test.js', ((gc C:\test.js) -replace 'HELLO','GOODBYE' -join "`r`n")) 

, 정말 같은, 파워 쉘을 통해 그것을 실행하는 접두사를 추가 속임수. 모든 사람들의 위대한 의견을 보내 주셔서 감사합니다. 지역 변수에 gc에서

gc C:\www\js\test.min.js -read 0 

또는 첫 번째 저장소 결과를 다음 sc 전화 :

Powershell -command "[io.file]::WriteAllText('C:\test.js', ((gc C:\.js) -replace 'HELLO','GOODBYE' -join \"`r`n\"))" 

답변

3

게시물 구축 단계는 cmd.exe에 의해 운영되며, 그래서 당신은 PowerShell을 에 의해 처리되지 cmd.exe 할 이스케이프 모든 것을 확인해야합니다.

명령에서 cmd.exe은 파이프와 sc 자체를 시도하고 수행합니다. sc.exe (명령 줄 서비스 제어 유틸리티)에 전달 된 텍스트 파일을 사용한 빠른 테스트는 잘못된 명령 줄이 전달되었을 때 도움말을 표시하고 키보드 입력을 기다리는 것을 나타냅니다.

모호성을 피하기 위해 전체 cmdlet 이름을 사용하는 것이 좋습니다.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -command "(get-content C:\www\js\test.min.js) -replace 'HELLO','GOODBYE' | set-content C:\www\js\test.min.js" 

는 "성공적으로 완료와 VS가 응답하지 않았다

+0

도움 주셔서 감사합니다. 내 '명령'이 이미 실제로 그 안에 큰 따옴표를 넣으면 어떨까요? – Aaron

+0

@Aaron :'cmd'는 이스케이프 문자 ('^'IIRC)를 가지고 있거나 따옴표 (' ""')를 두 번 사용하면됩니까? Cmd의 문서는 찾기가 힘들어서 약간의 노력이 필요할 수도 있습니다. 또 다른 옵션은 PSH 스크립트를 파일에 넣고 ("no build"로 프로젝트에 추가) 명령 행을 사용하여 실행하는 것입니다. – Richard

+0

알았어요. 이것은 완벽하게 완벽하게 작동합니다. 또한 세미콜론을 사용하여 4 개의 명령을 연결하여 VS 내에서 한 줄로 모두 호출 할 수있었습니다. 다시 감사 : Powershell -command "[io.file] :: WriteAllText ('C : \ test.js', ((gc C : \. js) -replace 'HELLO', 'GOODBYE' (예 : C : \ test.js) -replace 'HELLO', 'GOODBYE'-join \ "' (예 : C : \ test.js) -replace 'HELLO', 'GOODBYE'-join \ "' (예 : C : \ test.js) -replace 'HELLO', 'GOODBYE'-join \ "' r'n \ "))" – Aaron

1

이보십시오. PowerShell이 ​​파일을 쓰기 위해 열지 못하도록하는 읽기 읽기 핸들이 있습니다.

+0

이 .. 이봐는 다시 나를 도와 :

명령은 (확인하는 대화 형 cmd.exe에서 테스트) 같은 것을해야한다 다른 스레드 덕분에 정말 고마워! 이제 VS가 다른 스레드에서 나에게 보여준 위대한 명령을 실행하고 싶다. 내가 열린 읽기 핸들을 얻기 위해 할 수있는 일은 무엇인가? 이것은 포스트 빌드에서 일어난다. , 그래서 나는 모든 파일을 끝낼 것이라고 생각했다. 명령은 : [io.file] :: WriteAllText ('C : \ test.js', ((gc C : \ test.js) -replace 'HELLO' , 'GOODBYE'- 가입 "'r'n")) – Aaron

+0

'[io.file] :: WriteAllText (path, (gc path))'명령은 문제없이 실행되어야한다고 생각합니다. 왜냐하면 파일의 내용을 먼저 읽은 다음'WriteAllText'로 writtern을하기 때문입니다. – stej

+0

여전히 이상한 문제가 있었지만 파일 잠금 문제 일 가능성이 컸다고 생각합니다. VS/Powershell 결합하면 꽤 편한 것 같습니다. 결국 위에 게시 한 마지막 스 니펫에는 문제가없는 것 같습니다. 다시 Thx. – Aaron

관련 문제