在CMD中运行多条PowerShell脚本

6
我正在尝试在cmd中运行以下PowerShell脚本。这是一个简单的示例:
$path = "c:\"
cd $path
ls

一些包含引号的PowerShell脚本多行代码。

我阅读了这篇文章和@Alex在这篇文章中的回答,但是在多行代码之间用;连接起来并不能正常工作:

C:\Users\abcd>powershell "&c:\ ; ls"
&:'c:\'不是 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果
包括路径,请验证路径是否正确,然后重试。
位于第1行第2个字符:
+ &c:\ ; ls
+  ~~~
    + CategoryInfo          : ObjectNotFound: (c:\:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS:我的实际任务是运行以下代码(我提供了简单的任务,因为并非每个人都有数据库)。

$tabular_server = "abc_123\Tabular"

[Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices")
$server = New-Object Microsoft.AnalysisServices.Server
$server.connect($tabular_server)
$db = $server.Databases.Item("db_name")

$db.Process("ProcessClear")
$db.Process("ProcessDefault")
$server.Disconnect()

我建议放弃使用 cmd.exe 直接使用 PowerShell。 - Bill_Stewart
感谢 @Bill_Stewart,使用 cmd 调用 PowerShell 的原因是,最终我将所有内容放在 R 中。似乎 R 只有执行 cmd 的 system 命令,没有可以执行 PowerShell 脚本的命令。 - YJZ
3个回答

23

& 是 PowerShell 的调用运算符。该运算符用于调用以字符串形式提供的命令/函数(例如因为某人想要将它们表示为变量或者其路径包含空格),以及脚本块。

在您的情况下,只需将语句放在一行上,用分号隔开即可:

powershell.exe -Command "$path = 'c:\'; cd $path; ls"

然而,个人更喜欢将语句放在脚本块中(这就是调用运算符发挥作用的地方):

powershell.exe -Command "&{$path = 'c:\'; cd $path; ls}"

无论哪种方式都可以运作。但请注意,在双引号命令字符串内,您需要使用单引号或转义嵌套的双引号。

总之,对于更长、更复杂的PowerShell代码,不建议使用-Command参数进行行内执行。最好将代码编写为PowerShell脚本,并像这样运行:

powershell.exe -File "C:\path\to\your.ps1"

谢谢@Ansgar Wiechers。我想将它内联是因为我只需要发送脚本,而不是脚本+.ps1文件。- 有什么进一步的建议,人们通常如何处理这个问题?谢谢。 - YJZ
1
我会将PowerShell脚本发送给他们,并告诉他们在PowerShell控制台中运行它,而不需要使用“powershell.exe -File”。 - Ansgar Wiechers

0

对我来说可行。

powershell $path = 'c:\'; cd $path; ls

powershell c:\; ls

这是引用管道符的一种方法:

powershell ls c:\ ^| measure

这可能有效,但我没有汇编代码。

powershell {$tabular_server = 'abc_123\Tabular'; [Reflection.Assembly]::LoadWithPartialName('Microsoft.AnalysisServices'); $server = New-Object Microsoft.AnalysisServices.Server; $server.connect($tabular_server); $db = $server.Databases.Item('db_name'); $db.Process('ProcessClear'); $db.Process('ProcessDefault'); $server.Disconnect()}

编辑:

在cmd中,您可以使用“^”继续一行。它可以在不打开双引号的情况下以有限的方式在cmd提示符下运行powershell:

powershell echo (1 + ^
More? 2 + ^
More? 3)
6

因此,我不得不使用单引号。Cmd 会吃掉双引号。没有脚本块。再次强调,我没有这个程序集。

powershell $tabular_server = 'abc_123\Tabular'; ^
[Reflection.Assembly]::LoadWithPartialName('Microsoft.AnalysisServices'); ^
$server = New-Object Microsoft.AnalysisServices.Server; ^
$server.connect($tabular_server); $db = ^
$server.Databases.Item('db_name'); $db.Process('ProcessClear'); ^
$db.Process('ProcessDefault'); $server.Disconnect()

这对我来说绝对有效:

powershell using assembly System.Windows.Forms; ^
using namespace System.Windows.Forms; ^
[messagebox]::show('hello world')

0

在 c:\test.bat 中

    SET strArgList= C:\powershell\sample.ps1 
    SET strArgList=%strArgList% -Workbook C:\excel_template\TEMPLATE.xlsm 
    SET strArgList=%strArgList% -TextDir C:\text\Output  
    SET strArgList=%strArgList% -ExcelDir C:\Excel 
    SET strArgList=%strArgList% -FileMask *.txt

    echo %strArgList%
    PowerShell.exe C:\powershell\sample.ps1 -Workbook C:\excel_template\TEMPLATE.xlsm -TextDir C:\text\Output -ExcelDir C:\Excel -FileMask *.txt

    PowerShell.exe %strArgList%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接