Simple Powershell命令在后期构建事件中挂起Visual Studio 2010

时间:2011-02-25 11:33:05

标签: visual-studio-2010 powershell build

我有一个单行的Powershell命令,可以在命令行中完美运行。

然而,当我将它添加到我的VS2010项目的后期构建命令中时,它会运行,但只是挂起Visual Studio。几乎就像Visual Studio只是坐在那里等待Powershell命令完成,即命令行只需要按Enter键关闭窗口或其他东西。因为CPU使用率已经很低。

我是否必须做一些特别的事情才能让一个正常的Powershell命令在VS2010后期构建窗口中快乐地运行?

命令是:

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

所以在VS中,我添加前缀以通过Powershell启动它,如下所示:

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

更新

这最终成功了。感谢大家的好评。

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

2 个答案:

答案 0 :(得分:3)

帖子构建步骤由cmd.exe运行,因此您需要确保所有内容都已转义为由PowerShell 处理,而不是cmd.exe

在您的命令中,cmd.exe将尝试执行管道并sc本身。传递给sc.exe(命令行服务控制实用程序)的文本文件的快速测试表明它在传递无效命令行时显示帮助并等待键盘输入。

我建议使用完整的cmdlet名称以避免歧义。

该命令应该类似于(在交互式cmd.exe中进行测试以确认):

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"

答案 1 :(得分:1)

试试这个:

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

或首先将gc的结果存储到本地变量,然后调用sc。有一个打开的读取句柄可以阻止PowerShell打开文件进行写入。