Это то, с чем я боролся уже несколько дней, и каждый раз, когда мне кажется, что я отложил это, все разваливается.
Я хочу запустить новое окно терминала Windows, но с двумя оговорками:
-command
pwshНесколько дней назад я понял, как отправить аргументы командной строки в оболочку профилей. Передать аргумент командной строки в новое окно терминала, которое вот-вот будет запущено? #17521.
Это успешно открывает новое окно терминала с профилем my_profile
. Ведущий печатает my message
:
wt -p my_profile pwsh -noExit -command "'my message'"
Все было хорошо, пока это не сломалось сегодня. Следующее открывает новое окно терминала, но окно печатает ошибку:
wt -p my_profile pwsh -noExit -command "'my message' ; 'my second message'"
Ошибка выводится терминалом Windows (не pwsh):
[error 2147942402 (0x80070002) when launching `" 'my second message'"']
Если я исключим WT из уравнения, pwsh правильно получит входные данные для своего параметра -command
:
pwsh -noExit -command "'my message' ; 'my second message'"
#my message
#my second message
Действительно ли pwsh здесь не виноват?
Есть ли какой-то механизм pwsh, который может помочь мне решить эту проблему?
Буду признателен за любые решения в pwsh или wt
Предварительная версия терминала Windows 1.19
пвш 7.4
победа 11
@Bill_Stewart Множество причин. Например, я хочу запустить профили WT, а затем установить оболочку профиля в нужное состояние. Я хочу делать это на ходу, в командной строке, а не жестко закодировать это в определении профиля или в каком-то файле .ps1/.bat/.py.
Действительно ли вопрос: «Как мне избежать символа ;
в поле командной строки в профиле терминала Windows?»
@Bill_Stewart, судя по ответу Маклейтона, в этом была суть проблемы и то, каким должен был быть вопрос.
Терминал Windows использует ;
для разделения «действий» в командной строке wt
:
Командная строка wt принимает два типа значений: параметры и команды.
Параметры — это список флагов и других параметров, которые могут управлять поведением командной строки wt в целом.
Команды предоставляют действие или список действий, разделенных точкой с запятой, которые должны быть реализованы. Если команда не указана, то по умолчанию предполагается, что это команда новой вкладки.
Итак, если вы снова посмотрите на свою командную строку wt
:
wt -p my_profile pwsh -noExit -command "'my message' ; 'my second message'"
Терминал Windows пытается запустить эквивалент:
wt -p my_profile ; new-tab pwsh -noExit -command "'my message' ; new-tab 'my second message'"
first "action": ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
second "action": ^^^^^^^^^^^^^^^^^^^^
и вы получите новый терминал Windows с двумя вкладками — по одной для каждого «действия»:
new-tab
- на первой вкладке есть выходные данные pwsh -noExit -command "'my message'
- обратите внимание, что хотя кавычки my message
в аргументе "
не закрыты должным образом, PowerShell все равно выполняет его нормально (вы можете попробовать это из командной строки, но не из интерактивного сеанса PowerShell)
-command
— на второй вкладке отображается сообщение об ошибке 'my second message'"
, поскольку [error 2147942402 (0x80070002) when launching `" 'my second message'"']
не является допустимой командой. (Обратите внимание на дополнительный 'my second message'"
в ошибке — я предполагаю, что Терминал Windows добавил это, потому что вторая команда начинается с пробела, но я не уверен, если честно).
Я не смог найти это задокументировано, но я попытался экранировать "
как ;
, что, похоже, работает - \;
затем будет рассматривать wt
как буквальный \;
в команде «действие»:
wt -p my_profile pwsh -noExit -command "'my message' \; 'my second message'"
single action: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
и вы получите одну вкладку с выводом:
my message
my second message
Примечание. Все вышеперечисленное было протестировано в командной строке Windows — возможно, будут применяться разные правила экранирования в зависимости от того, откуда вы звоните ;
...
чувак, как я пропустил эту мелкую деталь. Спасибо за изучение, а также за обнаружение, что WT, возможно, использует `` в качестве escape-символа. Я могу подтвердить, что ваше решение работает и в Powershell 7.
Зачем вам нужно передавать аргумент командной строки? (Интересно, действительно ли это проблема XY...)