powershell中的条件执行(&&和||)

时间:2010-02-12 12:05:47

标签: syntax powershell command-execution

已经有问题解决我的问题(Can I get && to work in Powershell?),但有一点不同。我需要两个命令的 OUTPUT 。如果我刚开始运行,请参阅:

(command1 -arg1 -arg2) -and (command2 -arg1)

我不会看到任何输出,而是stderr消息。并且,正如所料,只需输入:

command1 -arg1 -arg2 -and command2 -arg1 

给出语法错误。

7 个答案:

答案 0 :(得分:27)

试试这个:

$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)

$()是一个子表达式,允许您在包含管道的内部指定多个语句。然后执行命令并管道到Out-Host,以便您可以看到它。下一个语句(子表达式的实际输出)应输出$?,即最后一个命令的成功结果。


$?适用于本机命令(控制台exe),但对于cmdlet,它会留下一些需要的东西。也就是说,当cmdlet遇到终止错误时,$?似乎只返回$false。似乎$?至少需要三种状态(失败,成功和部分成功)。因此,如果您使用的是cmdlet,则效果会更好:

$(command -arg1 -arg2 -ev err | Out-Host;!$err) -and 
$(command -arg1 -ev err | Out-Host;!$err)

这种打击仍然存在。也许这样的事情会更好:

function ExecuteUntilError([scriptblock[]]$Scriptblock)
{
    foreach ($sb in $scriptblock)
    {
        $prevErr = $error[0]
        . $sb
        if ($error[0] -ne $prevErr) { break }
    }
}

ExecuteUntilError {command -arg1 -arg2},{command2-arg1}

答案 1 :(得分:3)

简化 doThis ||的多步骤脚本退出1 非常有用,我用的是:

function ProceedOrExit { 
    if ($?) { echo "Proceed.." } else { echo "Script FAILED! Exiting.."; exit 1 } 
}

doThis; ProceedOrExit
doNext

# or for long doos
doThis
ProceedOrExit
doNext

答案 2 :(得分:1)

  • Bash / cmd的{​​{1}}和&&控制运营商没有PowerShell等效,因为您无法在PowerShell中定义自定义运算符, 没有好的解决方法

    • Keith Hill's answer中基于||的解决方法受到严重限制,因为它只能将正常命令输出发送到控制台(终端),从而阻止输出通过管道发送或在变量或文件中捕获。

在我的this answer中查找背景信息。

答案 3 :(得分:1)

Powershell 7 Preview 5拥有它们。  我不知道为什么在没有任何通知或说明的情况下将其删除。  https://devblogs.microsoft.com/powershell/powershell-7-preview-5/会根据要求提供这两个命令的输出。

echo 'hello' && echo 'there'
hello
there

echo 'hello' || echo 'there'
hello

答案 4 :(得分:0)

稍长一点的方法见下文

try {
  hostname
  if ($lastexitcode -eq 0) {
    ipconfig /all | findstr /i bios
  }
} catch {
  echo err
} finally {}

答案 5 :(得分:0)

在Powershell 7.0发布后,支持&&||

https://devblogs.microsoft.com/powershell/announcing-powershell-7-0/

New operators:
  Ternary operator: a ? b : c
  Pipeline chain operators: || and &&
  Null coalescing operators: ?? and ??=

答案 6 :(得分:-1)

最简单的解决方案是使用

<?php

...

// If no 'page' parameter is found, default to 1
$currentPage = isset($_GET['page']) ? $_GET['page'] : 1;
// Results per page
$limit = 10;
// Offset = (page - 1) * limit. (page 1 = 0, page 2 = 10, etc...)
$offset = ($currentPage - 1) * $limit;

if(isset($_POST['search']))
{
    $valueToSearch = $_POST['valueToSearch'];
    // search in all table columns
    // using concat mysql function
    $query = "SELECT * FROM `users` WHERE CONCAT(`id`, `fname`, `lname`, `age`) LIKE '%".$valueToSearch."%' LIMIT $limit OFFSET $offset";
    $search_result = filterTable($query);

}
 else {
    $query = "SELECT * FROM `users` LIMIT $limit OFFSET $offset";
    $search_result = filterTable($query);
}

// function to connect and execute the query
function filterTable($query)
{
    $connect = mysqli_connect("localhost", "root", "", "test_db");
    $filter_Result = mysqli_query($connect, $query);
    return $filter_Result;
}

?>

<!DOCTYPE html>
<html>
    <head>
        <title>PHP HTML TABLE DATA SEARCH</title>
        <style>
            table,tr,th,td
            {
                border: 1px solid black;
            }
        </style>
    </head>
    <body>

        <form action="php_html_table_data_filter.php" method="post">
            <input type="text" name="valueToSearch" placeholder="Value To Search"><br><br>
            <input type="submit" name="search" value="Filter"><br><br>

            <table>
                <tr>
                    <th>Id</th>
                    <th>First Name</th>
                    <th>Last Name</th>
                    <th>Age</th>
                </tr>

      <!-- populate table from mysql database -->
                <?php while($row = mysqli_fetch_array($search_result)):?>
                <tr>
                    <td><?php echo $row['id'];?></td>
                    <td><?php echo $row['fname'];?></td>
                    <td><?php echo $row['lname'];?></td>
                    <td><?php echo $row['age'];?></td>
                </tr>
                <?php endwhile;?>
            </table>
        </form>

        <a href="php_html_table_data_filter.php?page=<?php echo $page-- ?>">Previous</a>
        <a href="php_html_table_data_filter.php?page=<?php echo $page++ ?>">Next</a>

    </body>
</html>

在cmd shell中。当然,您不能在.ps1脚本中使用它,因此存在这种限制。