make/Makefile错误:在PowerShell、Windows上执行Remove-Item失败,即使使用-ErrorAction Ignore也是如此

nbysray5  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(196)

我发布这个问题是因为我在网上找不到任何关于它的东西。我在Windows 10上,我是make的新手。使用make在PowerShell上运行Remove-Item(在普通终端和Visual Studio的Developer PowerShell控制台上)无法忽略错误,基本上是不存在的文件要删除。
下面是我的Makefile的一部分,它没有运行:

REMOVE_COMMAND = Remove-Item -ErrorAction Ignore

clean:
    $(REMOVE_COMMAND) *.o

以下是运行make clean时的错误:

Remove-Item -ErrorAction Ignore *.o
process_begin: CreateProcess(NULL, Remove-Item -ErrorAction Ignore *.o, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [Makefile:4: clean] Error 2

如何让make运行Remove-Item来删除文件并忽略不存在的文件?
奇怪的是,在PowerShell上运行Remove-Item -ErrorAction Ignore *.o作为独立命令运行得很好(即使没有-ErrorAction Ignore)。我不相信文本替换与导致错误有任何关系,因为我已经尝试运行make,替换命令和不替换命令。我替换这个命令是因为我也将在Linux上运行这个Makefile(因此在这种情况下将使用rm)。

qq24tv8q

qq24tv8q1#

按预期返回一个Liner的PowerShell代码

我已经看到一些Stack Exchange帖子,您可以使用**$$null**结束PowerShell Make Recipe:

clean:
        Remove-Item -Path <NONEXISTENT_PATH>; $$null;

(e.g GNU Make and Windows Powershell : "Remove-Item -ErrorAction Ignore" does not work)。
但有时你可能希望你的Make Recipe知道退出代码。在指示Make使用哪个shell之后(见下文),只需将命令 Package 为:

& { exit $$( <POSH_COMMAND> ) }

您将能够将退出代码传递给Make。我知道一些Maven可能对此有意见,但它适用于一行程序。

告诉Make Your Shell

ifeq ($(OS),Windows_NT)
        SHELL := pwsh.exe
        .SHELLFLAGS := -NoProfile -Command 
    endif

如果你只是使用PowerShell,那么你不需要条件。

创建目标

我展示了三个常见的ErrorActions和它们的结果Make。
1.错误操作停止

clean:
        & {exit $$(Remove-Item -Path <NONEXISTENT_PATH> -ErrorAction Stop);}

配方输出:

Remove-Item: Cannot find path <NONEXISTENT_PATH> because it does not exist.<br>
    make: *** [Makefile:<line>: clean] Error 1

1.错误操作继续

clean:
        & { exit $$(Remove-Item -Path <NONEXISTENT_PATH> -ErrorAction Continue); }

配方输出:

Remove-Item: Cannot find path <NONEXISTENT_PATH> because it does not exist.

1.错误操作继续

clean:
        & { exit $$(Remove-Item -Path <NONEXISTENT_PATH> -ErrorAction Ignore); }

没有配方输出。这是意料之中的事。

相关问题