代码之家  ›  专栏  ›  技术社区  ›  user32882

powershell makefile无法识别get childitem命令

  •  0
  • user32882  · 技术社区  · 3 年前

    我正在尝试使用的powershell版本 make 为了简化我需要多次运行的一些命令。其中一个这样的命令如下所示:

    get-childitem -file | where {($_.extension -ne ".tex") -and ($_.extension -ne ".pdf") -and ($_.name -ne "Makefile")} | remove-item

    因此,我在makefile中设置如下:

    clean:
            get-childitem -file | where {($_.extension -ne ".tex") -and ($_.extension -ne ".pdf") -and ($_.name -ne "Makefile")} | remove-item
    

    当我跑步时 make clean 但是我得到了一个错误:

    get-childitem -file | where {(.extension -ne ".tex") -and (.extension -ne ".pdf") -and (.name -ne "Makefile")} | remove-item
    'get-childitem' is not recognized as an internal or external command,
    operable program or batch file.
    make: *** [Makefile:5: clean] Error 255
    

    为什么我会出现这个错误,并且允许我在Makefile中使用powershell命令,如上所示?

    0 回复  |  直到 3 年前
        1
  •  3
  •   mklement0    3 年前

    在Windows上, make 使用 cmd.exe 作为其默认外壳 ,而不是PowerShell。

    你可以 指导 make 使用PowerShell 将以下内容放在 Makefile s改编自 this answer :

    仅限Windows,使用 Windows PowerShell :

    SHELL := powershell.exe
    .SHELLFLAGS := -NoProfile -Command 
    
    # Sample target that echoes information about the PowerShell edition and version.
    # Note:
    #  * '@' preceding a command prevents the command itself from getting echoed.
    #  * '$' has special meaning to `make` itself, so to pass a verbatim '$'
    #    through to PowerShell, it must be escaped as '$$' 
    .PHONY: demo
    demo:
        @$$PSVersionTable
    

    仅限Windows,使用 PowerShell(核心)7+ :

    SHELL := pwsh.exe
    .SHELLFLAGS := -NoProfile -Command 
    
    .PHONY: demo
    demo:
        @$$PSVersionTable
    

    跨平台,在上使用Windows PowerShell 窗户 (并且必要的是, PowerShell(核心)7+ 在…上 Unix -类似平台):

    ifeq ($(OS),Windows_NT)
        SHELL := powershell.exe
    else
        SHELL := pwsh
    endif
    .SHELLFLAGS := -NoProfile -Command 
    
    .PHONY: demo
    demo:
        @$$PSVersionTable
    

    跨平台,在所有平台上使用PowerShell(Core)7+:

    ifeq ($(OS),Windows_NT)
        # Note: .exe is *required* on Windows; otherwise, 
        #       make.exe quietly falls back to cmd.exe
        SHELL := pwsh.exe
    else
        SHELL := pwsh
    endif
    .SHELLFLAGS := -NoProfile -Command 
    
    .PHONY: demo
    demo:
        @$$PSVersionTable
    

    笔记

    • 假设是 pwsh / pwsh.exe , PowerShell(核心) s CLI ,可以通过定位 $env:PATH ,官方安装程序会确保这一点,但如果需要,您可以使用完整的路径。

      • 注意:如前所述,在Windows上 必须 包括 .exe 在文件名/路径中。如果 制作 找不到可执行文件,它悄悄地返回到默认的shell( 命令提示符 在Windows上, /bin/sh 在类Unix平台上)。
    • 内置的 Windows PowerShell CLI, powershell.exe ,在 $env:PATH 默认情况下。