批处理脚本中的多行Powershell函数

时间:2018-08-09 12:55:19

标签: powershell batch-file

我想运行.bat-脚本,该脚本在其中调用一些powershell函数。功能不是很小,所以我想将其拆分。但是我做不到,转义符号无济于事(`,^)。 脚本示例:

set file=%1

set function="$file=$Env:file; ^
              $hash = CertUtil -hashfile $file SHA256 | Select -Index 1"

powershell -command %function%

2 个答案:

答案 0 :(得分:3)

您可以像这样在每行的末尾加上引号:

set file=%1

set function="$file=$Env:file; "^
           "$hash = CertUtil -hashfile $file SHA256 | Select -Index 1; "^
           "example break line further...."

powershell -command %function%

^用作多行字符,但也转义了第一个字符,因此也转义了引号。

答案 1 :(得分:1)

请勿将批处理文件语法与PowerShell混合使用。正如@Stephan所述,$function=在批处理文件中不起作用。您需要改用set function=。假设我要执行以下操作:

Get-Process
Get-ChildItem

然后代码应如下所示:

set function=Get-Process; ^
Get-ChildItem;

然后使用以下命令启动PowerShell

powershell -noexit -command %function%

-noexit已添加,以便您可以验证代码是否已成功执行。

还请记住,传递给PowerShell的是批处理多行,而在PowerShell中它只显示为一行,因此您必须记住分号(您实际上是在做分号,但我在此留给以后的读者注意)。 / p>


还有另一个选项如何将变量从批处理脚本传递到PowerShell。您可以这样做:

set name=explorer

set function=get-process $args[0]; ^
get-childitem

powershell -noexit  -command "& {%function% }" %name%

说明:

$args[0]表示传递给脚本块的第一个参数。要传递该参数,请在启动%name%时在脚本块后面添加powershell。另外,如this answer中所指出的(在注释中指出此,请向@Aacini致谢),您必须添加&运算符,并将脚本块放在大括号{ }中。


边注:说实话,我避免运行这样的脚本。更简单的方法是将文件另存为.ps1并在批处理文件中运行它:

powershell -noexit -file .\script.ps1