@volniol

Как вывести в командной строке имя запущенного batch-файла, содержащего PowerShell-скрипт?

Имеется batch-файл open_website.bat, который при каждом запуске Windows запускает PowerShell-скрипт, открывающий определённые web-страницы в браузере Edge для получения ежедневных бонусов и через определённое время закрывает браузер.

Как по завершении данного скрипта вывести в командную строку сообщение, что данный скрипт успешно завершён, указав имя этого конкретного batch-файла?

Код внутри batch-файла следующий:
@echo off
@powershell.exe -ExecutionPolicy Bypass -Command "$_=((Get-Content \"%~f0\") -join \"`n\");iex $_.Substring($_.IndexOf(\"goto :\"+\"EOF\")+9)"
@goto :EOF
Start-Process microsoft-edge:https://yoomoney.ru/moneylandia/lootboxes
Start-Sleep 5
Get-Process -Name "*msedge*" | Stop-Process
echo %~nx0 completed!
pause


Команда echo %~nx0 выводит только текст "%~nx0", вместо вывода содержимого данной переменной:
61054b564e058733399065.png
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
пример
@echo off
REM для https://qna.habr.com/q/1027240
set C=%~nx0
if NOT "%DEBUG%" equ "" echo Running with DEBUG set
REM using two environment parameters: C and DEBUG
REM NOTE:  passing arguments appears tricky when
REM powershell run with command built inline as string
@powershell.exe -ExecutionPolicy Bypass -Command "$debug=$env:DEBUG;$s=(get-content \"%~f0\") -join \"`n\"; $s = $s.substring($s.IndexOf(\"goto :\"+\"EOF\")+9);if ($debug -ne $null){write-output (\"Running:`n{0}\" -f$s);} invoke-expression -command $s"
@goto :EOF
# powershell code



start-sleep 5
write-output ( 'Calling script: {0}' -f $env:C)
pause

exit 0

выполняем:
c:\Users\sergueik\Desktop>set debug=1

c:\Users\sergueik\Desktop>show_caller.cmd
Running with DEBUG set
Running:


Start-Sleep 5
write-output ( 'Calling script: {0}' -f $env:C)
pause
exit 0


Calling script: show_caller.cmd
Press Enter to continue...:
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
wisgest
@wisgest
Не ИТ-специалист
Ваш командный файл содержит в себе код PowerShell, который запускается командой во 2-й строке и после выполнения которого стоит в 3-й строке команда завершения командного файла. Кем выполняются последние две строки я не совсем понимаю. Можно попробовать перенести их вверх и вставить перед 3-й.

Но можно было бы обойтись вообще без PowerShell, используя команду start и утилиты tasklist, taskkill и timeout примерно так:
@start  microsoft-edge:https://yoomoney.ru/moneylandia/lootboxes
@timeout /t 5 /nobreak>nul
@for /f %%1 in ('tasklist^|find /i "msedge"') do @taskkill /im %%1 /f
@echo %~nx0 completed!
@pause
Ответ написан
@MaxKozlov Куратор тега PowerShell
Ваша ошибка в том, что код "echo %~nx0 completed!" выполняет powershell, который не знает что такое %~nx0 (echo - алиас для write-output)
Так что или как предложил сергей кузьмин
или такая правка
@echo off
@powershell.exe -ExecutionPolicy Bypass -Command "$fn = \"%~f0\"; $_=((Get-Content $fn) -join \"`n\");iex $_.Substring($_.IndexOf(\"goto :\"+\"EOF\")+9)"
@goto :EOF
Start-Process microsoft-edge:https://yoomoney.ru/moneylandia/lootboxes
Start-Sleep 5
Get-Process -Name "*msedge*" | Stop-Process
echo "$fn completed!"
pause
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы