node.js - 如果相同目录中存在同名文件,则省略 “.cmd”时,调用运算符(operator)(&)在新窗口中运行命令

标签 node.js windows powershell node-modules powershell-core

如果我在命令中省略了后缀“.cmd”,则会在新窗口中打开它。为什么是这样?是什么触发新窗口打开的?
Powershell 5 Powershell Core 7 中,以下第一个将导致打开一个新窗口,而其他三个将在同一窗口中显示输出:

  • & 'C:\some_path\node_modules\.bin\ava' 'help'
  • & '.\node_modules\.bin\ava' 'help'(之前使用过的cd C:\some_path)
  • & 'C:\some_path\node_modules\.bin\ava.cmd' 'help'
  • & 'C:\some_path\node_modules\.bin\ava.ps1' 'help'

  • 同时,在 cmd 中,所有三个程序在同一窗口中显示其输出,根本没有打开新窗口:
  • C:\some_path\node_modules\.bin\ava help
  • .\node_modules\.bin\ava help(之前使用过的cd C:\some_path)
  • C:\some_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代码使用proposed configuration调试AVA脚本完成的,因此,我对所使用命令的影响是有限的。
    $env:PATHEXT等于.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
    如果我将文件ava重命名为ava_2,则不再打开任何新窗口。如果创建了一个名为ava的空文件,则命令& 'C:\some_path\node_modules\.bin\ava' 'help'再次打开一个新窗口。

    最佳答案

    为什么不使用Start-Process代替,所以您可以控制它是否打开一个新窗口?

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

    关于node.js - 如果相同目录中存在同名文件,则省略 “.cmd”时,调用运算符(operator)(&)在新窗口中运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63224532/

    相关文章:

    powershell - 从网站下载图像

    Azure Devops - 如何在部署后的应用服务上运行 powershell 脚本?

    node.js - Windows 上 Node 的 PhantomJS

    javascript - 当 PassPhrase 相同时,需要 SJCL 进行相同的加密 AES 256 输出

    c++ - 根据字体句柄获取字体文件名 (HFONT)

    java - 无法使用 Java 在 Windows 中删除文件

    powershell - 如何检查在 Windows Server 2008 R2 上启用了哪个 SMB 版本

    javascript - 如何根据属性的总和来组织对象数组?

    javascript - 如何模拟回调函数以测试其位于另一个函数的参数内

    windows - 如何使用 Go 翻转文件的 Windows 存档位