【问题标题】:Simple Powershell command hangs Visual Studio 2010 in post-build event简单的 Powershell 命令在构建后事件中挂起 Visual Studio 2010
【发布时间】:2011-02-25 20:44:58
【问题描述】:

我有一个单行 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\"))"

【问题讨论】:

    标签: visual-studio-2010 powershell build


    【解决方案1】:

    后期构建步骤由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"
    

    "

    【讨论】:

    • 感谢您的帮助。如果我的“命令”实际上已经包含双引号怎么办?
    • @Aaron: cmd 确实有转义字符(^ IIRC),或者如果你加倍引号("")? Cmd 的文档很难找到,因此您可能需要一些努力。另一种选择是将 PSH 脚本放入文件中(以“no build”的形式添加到项目中)并使用命令行执行。
    • 好的,就是这样。这完全可以完美地工作。我还能够使用分号将 4 个命令链接在一起,这样我就可以从 VS 中的一行调用它们。再次感谢:Powershell -command "[io.file]::WriteAllText('C:\test.js', ((gc C:\.js) -replace 'HELLO','GOODBYE' -join \"r n\"));[io.file]::WriteAllText('C:\test.js', ((gc C:\test.js) -replace 'HELLO','GOODBYE' -join \"r n\"));[io.file]::WriteAllText('C:\test.js', ((gc C:\test.js) -replace 'HELLO','GOODBYE' -join \"r n\"));[io.file]::WriteAllText('C:\test.js', ((gc C:\test.js) -replace 'HELLO','GOODBYE' -join \"r n\"))"
    • 考虑使用脚本文件。运行起来要容易得多,而且转义字符也没有问题。
    【解决方案2】:

    试试这个:

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

    或者首先将来自gc 的结果存储到一个局部变量中,然后调用sc。有一个打开的读取句柄阻止 PowerShell 打开文件进行写入。

    【讨论】:

    • 成功完成,VS 没有挂起。嘿,你又在另一个线程中帮助了我。非常感谢!所以现在我只想让 VS 运行你在另一个线程中向我展示的伟大命令。我能做些什么来绕过打开的读取句柄?这发生在后期构建中,所以我想我会完成所有文件。命令是: [io.file]::WriteAllText('C:\test.js', ((gc C:\test.js) -replace 'HELLO','GOODBYE' -join "rn") )
    • 我认为[io.file]::WriteAllText(path, (gc path))这个命令运行应该没有问题,因为文件的内容是先读取然后用WriteAllText写入的。
    • 它仍然有一些奇怪的问题,但我认为你最初的预感是正确的,因为它们可能是文件锁定问题。 VS/Powershell 的组合看起来确实很不稳定。最后,我在上面发布的最终 sn-p 似乎没有问题。 Thx 再次堆积。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多