Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 调用运算符(&;)在忽略";时在新窗口中运行命令;。cmd";如果同一目录中存在同名文件_Node.js_Windows_Powershell_Node Modules_Powershell Core - Fatal编程技术网

Node.js 调用运算符(&;)在忽略";时在新窗口中运行命令;。cmd";如果同一目录中存在同名文件

Node.js 调用运算符(&;)在忽略";时在新窗口中运行命令;。cmd";如果同一目录中存在同名文件,node.js,windows,powershell,node-modules,powershell-core,Node.js,Windows,Powershell,Node Modules,Powershell Core,如果我在命令中省略后缀“.cmd”,它将在新窗口中打开。为什么会这样?是什么触发了新窗口的打开 在Powershell 5和Powershell Core 7中,以下第一项会打开一个新窗口,而其他三项会在同一窗口中显示输出: 和“C:\some\u path\node\u modules\.bin\ava”“help” &.\node\u modules\.bin\ava“帮助”(以前使用的cd C:\some\u路径) 和'C:\some\u path\node\u modules\.bin\

如果我在命令中省略后缀“.cmd”,它将在新窗口中打开。为什么会这样?是什么触发了新窗口的打开

Powershell 5Powershell Core 7中,以下第一项会打开一个新窗口,而其他三项会在同一窗口中显示输出:

  • 和“C:\some\u path\node\u modules\.bin\ava”“help”
  • &.\node\u modules\.bin\ava“帮助”
    (以前使用的
    cd C:\some\u路径
  • 和'C:\some\u path\node\u modules\.bin\ava.cmd''help'
  • 和“C:\some\u path\node\u modules\.bin\ava.ps1”“帮助”
  • 同时,在cmd中,所有三个程序都在同一窗口中显示其输出,根本不会打开任何新窗口:

  • C:\some\u path\node\u modules\.bin\ava help
  • \node\u modules\.bin\ava help
    (以前使用的
    cd C:\some\u路径
  • C:\some\u path\.bin\ava help

  • 我只使用了help命令作为示例,最后我喜欢使用
    ava debug--serial someFile.js


    软件版本:

    • Windows:Windows 10,版本2004(内部版本19041.388)
    • 节点:v12.18.3
    • AVA:3.11.0

    .bin
    目录中有三个相关文件:

    ava.cmd

    @ECHO off
    SETLOCAL
    CALL :find_dp0
    
    IF EXIST "%dp0%\node.exe" (
      SET "_prog=%dp0%\node.exe"
    ) ELSE (
      SET "_prog=node"
      SET PATHEXT=%PATHEXT:;.JS;=;%
    )
    
    "%_prog%"  "%dp0%\..\ava\cli.js" %*
    ENDLOCAL
    EXIT /b %errorlevel%
    :find_dp0
    SET dp0=%~dp0
    EXIT /b
    
    ava.ps1

    #!/usr/bin/env pwsh
    $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
    
    $exe=""
    if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
      # Fix case when both the Windows and Linux builds of Node
      # are installed in the same directory
      $exe=".exe"
    }
    $ret=0
    if (Test-Path "$basedir/node$exe") {
      & "$basedir/node$exe"  "$basedir/../ava/cli.js" $args
      $ret=$LASTEXITCODE
    } else {
      & "node$exe"  "$basedir/../ava/cli.js" $args
      $ret=$LASTEXITCODE
    }
    exit $ret
    
    ava

    #!/bin/sh
    basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
    
    case `uname` in
        *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
    esac
    
    if [ -x "$basedir/node" ]; then
      "$basedir/node"  "$basedir/../ava/cli.js" "$@"
      ret=$?
    else 
      node  "$basedir/../ava/cli.js" "$@"
      ret=$?
    fi
    exit $ret
    


    由于调用是由visual studio代码使用调试AVA脚本完成的,所以我对所用命令的影响是有限的



    $env:PATHEXT
    等于
    .COM;。EXE;。蝙蝠;。CMD;。VBS;。VBE;。JS;。JSE;。WSF;。WSH;。理学硕士;。CPL



    如果我将文件
    ava
    重命名为
    ava_2
    ,则不会再打开新窗口。如果创建名为
    ava
    的空文件,则命令
    和“C:\some\u path\node\u modules\.bin\ava”“help”将再次打开一个新窗口。

    为什么不改为使用启动进程,以便您可以控制它是否打开一个新窗口

    Start-Process -FilePath 'C:\some_path\node_modules\.bin\ava' -ArgumentList 'help' -NoNewWindow -Wait
    

    将.cmd添加到pathext将修复丢失的文件。Ava是javascript运行时的一个包

    $env:PATHEXT += ';.CMD'
    C:\Windows\System32\node_modules\.bin\ava.cmd help
    
    将其添加到路径将修复它:

    $env:path += ';C:\Windows\System32\node_modules\.bin'
    ava help
    
    这个文件夹包含ava.cmd,有一个名为ava的文件,它是一个shell脚本,还有一个名为ava.ps1的文件,它是一个powershell脚本。出于某种原因,隐藏或重命名“ava”shell脚本也可以修复它

    参考当前目录也可以:

    .\Windows\System32\node_modules\.bin\ava help
    
    最小可复制示例:

    '' | set-content hi
    'echo cmd:hi' | set-content hi.cmd
    & $pwd\hi  # pops open another window for a split second
    

    如果您尝试使用
    获取帮助
    而不是
    帮助
    ,该怎么办?使用
    获取帮助
    而不是
    帮助
    没有帮助,原因有二:1。我只使用了help命令作为示例,最后我喜欢使用
    ava debug--serial someFile.js
    2<代码>获取帮助
    在其自身的帮助中说明:“显示有关PowerShell cmdlet和概念的帮助。”我不确定发生了什么。node.exe是否设置为运行js文件,以及.js是否从$env:pathext中取出?我认为这会导致它,类似于尝试运行.py文件而不向PATHEXT添加.py。使用完全限定路径(即无搜索),它执行文件名而不带扩展名。如果没有扩展名,它将调用
    ShellExecuteExW
    ,而不是
    CreateProcessW
    ShellExecuteExW
    不使用
    PATHEXT
    ,但它有一个默认的文件扩展名列表,其中包括“.CMD”。
    ShellExecuteExW
    的默认行为是创建一个新的控制台窗口,除非传递了标志
    请参见\u MASK\u NO\u console
    。第二种情况与工作目录(“.”)相关,它的实现类似于搜索,因此解析为“ava.ps1”,由当前shell进程执行。@ErykSun看起来像是在路径中添加了一个文件夹,使其类似于第二种情况。由于调用是由visual studio代码使用,我对所用命令的影响有限。
    $env:PATHEXT
    等于
    .COM;。EXE;。蝙蝠;。CMD;。VBS;。VBE;。JS;。JSE;。WSF;。WSH;。理学硕士;。CPL已存在。由于我们将AVA作为本地npm包安装在每个项目中,因此我不会将每个
    .bin
    目录添加到
    $env:path