我在cmd中尝试以下powershell脚本。这是一个微不足道的例子:
$path = "c:\"
cd $path
ls
-some powershell脚本多行和带引号
中阅读了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()
答案 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()}