Node.js 调用运算符(&;)在忽略";时在新窗口中运行命令;。cmd";如果同一目录中存在同名文件
如果我在命令中省略后缀“.cmd”,它将在新窗口中打开。为什么会这样?是什么触发了新窗口的打开 在Powershell 5和Powershell Core 7中,以下第一项会打开一个新窗口,而其他三项会在同一窗口中显示输出: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\
和“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”“帮助”
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