NodeJS 调用操作符(&)在新窗口中运行命令时省略“.cmd”,如果具有相同名称的文件存在于同一目录中

biswetbf  于 2023-06-05  发布在  Node.js
关注(0)|答案(3)|浏览(415)

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

  1. & 'C:\some_path\node_modules\.bin\ava' 'help'
  2. & '.\node_modules\.bin\ava' 'help'(以前使用cd C:\some_path
  3. & 'C:\some_path\node_modules\.bin\ava.cmd' 'help'
  4. & 'C:\some_path\node_modules\.bin\ava.ps1' 'help'
    同时,在cmd中,所有三个程序都在同一个窗口中显示它们的输出,根本没有打开新窗口:
  5. C:\some_path\node_modules\.bin\ava help
  6. .\node_modules\.bin\ava help(之前使用cd C:\some_path
  7. C:\some_path\.bin\ava help
    我使用help命令只是作为示例,最后我喜欢使用ava debug --serial someFile.js
    软件版本:
  • Windows:Windows 10,版本2004(Build 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'将再次打开一个新窗口。

tktrz96b

tktrz96b1#

为什么不使用Start-Process,这样你就可以控制它是否打开一个新窗口?

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

mec1mxoz2#

将.cmd添加到pathext可以修复丢失的路径。Ava是node.js 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
l2osamch

l2osamch3#

这是由PATTEXT变量决定的...
参见MS Learn -PATH命令和PATHEXT变量
在我的Windows 10机器上,顺序设置为...

$env:PATHEXT -split ';'

.COM
.EXE
.BAT
.CMD
.VBS
.VBE
.JS
.JSE
.WSF
.WSH
.MSC
.CPL

相关问题