了解在批处理中使用参数执行 powershell

The*_*ist 8 windows powershell command-line command-line-arguments batch-file

我已经研究了一段时间,但我不明白这是如何工作的。我需要的是:

  1. 能够运行批处理文件
  2. 批处理文件应该有参数
  3. 参数应从批处理文件传递到同一文件中的 PowerShell 脚本

为什么我需要这个?因为我需要运行一个简单的批处理文件来做一些事情,但我需要只能在 PowerShell 中工作的高级功能。具体来说:我需要SaveFileDialog一些应用程序。

以下是我现在所拥有的,在那里我剥离了SaveFileDialog.

<# : 

@echo off
setlocal

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

#>

Write-Host "Hello, I'm PowerShell!"
Run Code Online (Sandbox Code Playgroud)

如果我把所有这些都放在一个批处理文件中,比如说,myfile.bat. 它运行并调用 PowerShell 并写入该消息。

我的问题/请求:如何运行myfile.bat param1 param2 param3,并将这些参数/参数传递给我的 PowerShell 脚本?我真的很感激一个最小的例子,它只是通过 powershell 的write-host.

请随时询问更多详情。谢谢!

Vom*_*yle 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
Run Code Online (Sandbox Code Playgroud)

更多资源