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? Я бы очень признателен за минимальный пример, который просто печатает параметры через write-host powershell.

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

3 ответа3

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

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

2

Как я могу запустить 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!!
    


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

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 . . .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .