Оператор вызова (&) запускает команду в новом окне при опускании ".cmd", если файл с таким же именем существует в том же каталоге. - PullRequest
3 голосов
/ 03 августа 2020

Если я опущу суффикс «.cmd» в команде, она откроется в новом окне. Почему это? Что вызывает открытие нового окна?

В Powershell 5 и Powershell 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 все три программы показывают свой вывод в одном окне, новое окно не открывается вообще:

  1. C:\some_path\node_modules\.bin\ava help
  2. .\node_modules\.bin\ava help (использовалось cd C:\some_path раньше)
  3. 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, отлаживающим сценарий 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' снова открывает новое окно.

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Добавление .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, который является сценарием оболочки, и файл с именем ava.ps1, который представляет собой сценарий PowerShell. По какой-то причине скрытие или переименование сценария оболочки "ava" также исправляет это.

Ссылка на текущий каталог также работает:

.\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
0 голосов
/ 03 августа 2020

Почему бы вместо этого не использовать Start-Process, чтобы вы могли контролировать, открывает оно новое окно или нет?

Start-Process -FilePath 'C:\some_path\node_modules\.bin\ava' -ArgumentList 'help' -NoNewWindow -Wait
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...