【问题标题】:Run multiple lines of PowerShell script in CMD在 CMD 中运行多行 PowerShell 脚本
【发布时间】:2018-06-25 17:05:05
【问题描述】:

我正在尝试在 cmd 中执行以下 powershell 脚本。这是一个简单的例子:

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

一些多行并带有引号的 PowerShell 脚本。

我在this post 中阅读了this post 和@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 使用 cmd 调用 powershell 的原因是,最终我将所有内容都放在R 中。看来R只有system可以执行cmd的命令,没有可以执行powershell脚本的命令。

标签: powershell cmd


【解决方案1】:

& 是 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 文件。 - 任何进一步的建议人们通常如何处理这个?谢谢你-
  • 我只需向他们发送 PowerShell 脚本,其中包含从不需要 powershell.exe -File 的 PowerShell 控制台运行它的指令。
【解决方案2】:

在 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%

【讨论】:

    【解决方案3】:

    为我工作。

    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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 2016-07-13
      • 2021-02-05
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多