在cmd中运行多行powershell脚本

时间:2018-01-16 22:04:34

标签: powershell cmd

我在cmd中尝试以下powershell脚本。这是一个微不足道的例子:

$path = "c:\"
cd $path
ls

-some powershell脚本多行和带引号

我在this post

中阅读了this post和@ Alex的回答

但将多行放在一起;他们之间没有工作:

C:\Users\abcd>powershell "&c:\ ; ls"
& : The term 'c:\' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char: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()

3 个答案:

答案 0 :(得分:5)

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

在你的情况下,只需将你的语句放在一行,用分号分隔就足够了:

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

但是,我个人更喜欢将语句放在一个scriptblock中(这是调用操作符发挥作用的地方):

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

但是,无论哪种方式都应该有效。请注意,在双引号命令字符串中,您需要使用单引号或转义嵌套双引号。

所有这些都说明,不建议通过-Command参数进行更长,更复杂的PowerShell代码内联执行。最好将代码写入PowerShell脚本并按如下方式运行:

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

答案 1 :(得分: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%

答案 2 :(得分: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()}