Понимание выполнения powershell внутри пакета с параметрами


7

Я копался в этом некоторое время, но я не мог понять, как это работает. Что мне нужно это:

  1. Уметь запускать командный файл
  2. Пакетный файл должен иметь параметры
  3. Параметры должны быть переданы из командного файла в сценарий PowerShell, который находится в том же файле

Зачем мне это нужно? Потому что мне нужно запустить простой командный файл, чтобы сделать что-то, но мне нужны расширенные функциональные возможности, которые работают только из PowerShell. Конкретно: мне нужно какое- SaveFileDialogто приложение.

Вот то, что у меня есть сейчас, где я удалил сложные части SaveFileDialogи оставил простую партию + часть PowerShell:

<# : 

@echo off
setlocal

powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF

#>

Write-Host "Hello, I'm PowerShell!"

Если я ставлю все это в пакетном файле, скажем, myfile.bat. Он запускается и вызывает PowerShell и записывает это сообщение.

Мой вопрос / запрос : как я могу запустить myfile.bat param1 param2 param3и передать эти аргументы / параметры в мой скрипт PowerShell? Я действительно ценю минимальный пример, который просто печатает параметры через powershell write-host.

Пожалуйста, не стесняйтесь спрашивать более подробную информацию. Спасибо!

Ответы:


3

Как я могу запустить myfile.bat param1 param2 param3 и передать эти аргументы / параметры в мой скрипт PowerShell?


Создайте пакетный сценарий для принятия аргументов

Вам, очевидно, нужно масштабировать пакетные аргументы с последующимSET arg#=%~#

Я сделал примерный пакетный сценарий, показывающий аргументы, устанавливающие переменные вверху, и передал их в сценарий PS, который позже свяжется с конечным результатом, чтобы помочь прояснить больше в конце этого ответа, надеюсь.

Пример пакетного скрипта

@ECHO ON

SET arg1=%~1
SET arg2=%~2
SET arg3=%~3
SET arg4=%~4

SET PSScript=C:\Users\User\Desktop\Test.ps1

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%' '%arg1%' '%arg2%' '%arg3%' '%arg4%'"
EXIT /B

Создайте сценарий PowerShell для принятия аргументов

Очевидно, вам нужно масштабировать аргументы PowerShell с последующим$arg#=$args[#]

Пример скрипта PowerShell

$arg1=$args[0]
$arg2=$args[1]
$arg3=$args[2]
$arg4=$args[3]

Write-Host "$arg1 is a beauty!!"
Write-Host "$arg2 is cool!!"
Write-Host "$arg3 has body odor!!"
Write-Host "$arg4 is a beast!!"

Связывая это вместе

  • Передайте аргументы в пакетный скрипт:

    • c:\users\user\desktop\test.cmd "Selena" "Justin" "Donald" "Bernie"
  • Передайте аргументы скрипту PowerShell:

  • Powershell -ExecutionPolicy Bypass -Command "& 'C:\Users\User\Desktop\Test.ps1' 'Selena' 'Justin' 'Donald' 'Bernie'
    
  • Полные результаты отражаются на:

  • c:\users\user\desktop\test.cmd "Selena" "Justin" "Donald" "Bernie"
    
    SET arg1=Selena
    
    SET arg2=Justin
    
    SET arg3=Donald
    
    SET arg4=Bernie
    
    SET PSScript=C:\Users\User\Desktop\Test.ps1
    
    SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
    
    CD /D "C:\Windows\System32\WindowsPowerShell\v1.0"
    
    Powershell -ExecutionPolicy Bypass -Command "& 'C:\Users\User\Desktop\Test.ps1' 'Selena' 'Justin' 'Donald' 'Bernie'"
    Selena is a beauty!!
    Justin is cool!!
    Donald has body odor!!
    Bernie is a beast!!
    

    введите описание изображения здесь


Дополнительные ресурсы


Спасибо чувак! К сожалению, мне это сейчас не нужно, но как только я это сделаю, я рассмотрю ваш ответ. Еще раз спасибо!
Квантовый физик

2

Передача нескольких аргументов в сценарий PowerShell с помощью пакетного сценария

Вы можете использовать что-то похожее на метод ниже, так как я смог получить пакетный сценарий для передачи аргументов сценарию PS с использованием этого синтаксиса.

Он должен создать динамический сценарий PS вверху ( :DynamicPSScriptBuildподпрограмма), и он удалит его, если он уже существует, а также удалит его, как только он завершит обработку всех выполнений.

Мне пришлось использовать PS, -fileа не -iex(причина, по которой файл PS1 должен существовать, и его динамическая сборка), но он работает, как и ожидалось, когда я тестировал его, передавал соответствующие аргументы скрипту один за другим, причем каждый аргумент был одна итерация выполнения сценария PS.

Я не был уверен, что вам нужно, чтобы все аргументы передавались в сценарий PS один за другим, или все передавались одновременно, или как ваша логика сценария PS будет обрабатывать несколько аргументов, передаваемых ему во время одного и того же выполнения, но, возможно, это даст вам достаточно подробно, чтобы настроить соответственно.

Часть приведенного ниже сценария FOR %%A IN ("Hello I'm PowerShell!", "Goodbye I'm Leaving", "Come with it and get some more"будет частью, которую вы помещаете каждую строку для использования в качестве аргумента, передаваемого сценарию PS один за другим на каждой итерации выполнения, где каждое значение строки находится в двойных кавычках и разделено запятыми.


Пример скрипта

(Возможно, вы захотите включить @ECHO OFFи вынуть pauseкоманду, так как я использовал их, чтобы показать все на итерации, чтобы убедиться, что все работает как положено)

<# : 

@ECHO ON
SETLOCAL

:DynamicPSScriptBuild
SET PSScript=%~f0.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
ECHO param($a)        >>"%PSScript%" 
ECHO Write-Host "$a"  >>"%PSScript%" 

:SetPSScriptArguments
FOR %%A IN (    "Hello I'm PowerShell!", 
                "Goodbye I'm Leaving", 
                "Come with it and get some more"
) DO CALL :Powershell "%%~A"
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
GOTO :EOF

:PowerShell
PowerShell -NoProfile -ExecutionPolicy Bypass -file "%PSScript%" "%~1"
pause
GOTO :EOF

Дополнительные ресурсы


Спасибо за ответ. Хотя это может быть последним средством, я надеюсь, что есть что-то, что не требует написания временного файла. Временный файл может не сработать для того, что я планирую сделать, или, по крайней мере, это будет неприятно.
Квантовый физик

На самом деле мое текущее решение состоит в том, что я разделил пакетный файл и файлы powershell ... Я не доволен этим, но я не смог найти чистый способ поместить их оба в один файл и передать параметры между ними. Спасибо за попытку помочь :)
Квантовый физик

К сожалению, мне это не помогло, но, может быть, это кому-то еще, кто не против написания временных сценариев :)
Квантовый физик,

@TheQuantumPhysicist Не уверен, что вы все еще ищете решение, но я опубликовал альтернативный ответ. Надеюсь, вы получили информацию, которую вы ищете
root

@ root, извини, парень. Ваше решение передает сценарии, а не параметры. Мой сценарий огромен, и это делает ваше решение непрактичным. Извините, и спасибо за попытку.
Квантовый физик

0

Передайте переменную пакета напрямую в строку Powershell из файла пакета. Чтобы проверить это, я передал Write-Hostкомандлет в качестве аргумента.

foo.bat:

@echo off

set arg1=%1

powershell.exe %1 "this is from powershell"

pause

Бери .batс аргументом,

.\foo.bat Write-Host

Выход:

this is from powershell
Press any key to continue . . .
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.