作为预生成事件执行PowerShell脚本失败

Executing PowerShell script as pre-build event fails

本文关键字:执行 PowerShell 脚本 失败 事件      更新时间:2023-09-26

我正在处理一个相当大的JavaScript项目,该项目嵌入到ASP.NET MVC项目中。我已经将JS代码分成了几个(12 ish)文件,以便更容易地处理代码。问题是,我已经失去了IntelliSense,而且,我需要链接页面上的几个文件。出现了这样一个想法:让我们制作一个PS脚本,将文件连接到一个文件中。它工作得很好,我只引用该文件,所以我有IntelliSense,而且,我只需要将该文件链接到页面中。但是,我需要在每次构建时手动运行该脚本。因此,下一个想法是设置一个预构建事件来运行脚本。问题来了,脚本没有成功运行。

这是脚本:

if(Test-Path myprefix-concatenated.js){
Remove-Item myprefix-concatenated.js
}
cat myprefix-*.js > concatenated.js
Rename-Item -path concatenated.js -newname myprefix-concatenated.js

以下是预构建事件:

powershell.exe -file "$(ProjectDir)'Scripts'my-scripts'concat.ps1"

这是构建的输出:

3>  Get-Content : An object at the specified path myprefix-* does not exist, or has been
3>  filtered by the -Include or -Exclude parameter.
3>  At ...'Scripts'my-scripts'concat.ps1:4 char:4
3>  + cat <<<<  myprefix-* > concatenated.js
3>      + CategoryInfo    : ObjectNotFound: (System.String[]:String[]) [Get-
3>     Content], Exception
3>      + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetCo
3>     ntentCommand

在此之后,构建成功,但不会发生串联。如果我手动运行脚本,它会起作用。你知道是什么原因导致了这个问题,以及如何解决它吗?提前感谢!

我不会假设当前目录的设置如您所期望的那样。您使用的是相对路径,这可能不是一个好主意。您可以将路径作为参数传递给脚本,例如

powershell.exe -file "$(ProjectDir)'Scripts'my-scripts'concat.ps1" "$(ProjectDir)"
-- concat.ps1 --
param($projectDir)
if (Test-Path $projectDir'Scripts'my-scripts'myprefix-concatenated.js) {
    Remove-Item $projectDir'Scripts'my-scripts'myprefix-concatenated.js
}
cat $projectDir'Scripts'my-scripts'myprefix-*.js > $projectDir'Scripts'my-scripts'concatenated.js
Rename-Item $projectDir'Scripts'my-scripts'concatenated.js -newname $projectDir'Scripts'my-scripts'myprefix-concatenated.js

如果您使用PowerShell v3,则可以使用$PSScriptRoot自动变量引用相对于concat.ps1脚本所在位置的文件,例如:

if (Test-Path $PSScriptRoot'myprefix-concatenated.js) {
    Remove-Item $PSScriptRoot'myprefix-concatenated.js
}
cat $PSScriptRoot'myprefix-*.js > $PSScriptRoot'concatenated.js
Rename-Item $PSScriptRoot'concatenated.js -newname $PSScriptRoot'myprefix-concatenated.js