当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 shell 中运行命令

作者:精品下载站 日期:2024-12-14 03:05:13 浏览:13 分类:玩电脑

在 shell 中运行命令


PowerShell 是一种命令行 shell 和一种用于自动化的脚本语言。与其他 shell 类似,例如 Linux 上的 bash 或 Windows Command Shell (cmd.exe),PowerShell 允许您运行系统上可用的任何命令,而不仅仅是 PowerShell 命令。

命令类型

对于任何操作系统中的任何 shell,都存在三种类型的命令:

  • Shell 语言关键字是 shell 脚本语言的一部分。

    • bash 关键字的示例包括:ifthenelseeliffi
  • cmd.exe 关键字的示例包括:dircopymoveif回显
  • PowerShell 关键字的示例包括:forforeachtrycatchtrap >。

Shell 语言关键字只能在 shell 的运行时环境中使用。 shell 外部没有提供关键字功能的可执行文件。

  • 操作系统本机命令是安装在操作系统中的可执行文件。可执行文件可以从任何命令行 shell 运行,例如 PowerShell。这包括可能需要其他 shell 才能正常工作的脚本文件。例如,如果您在 PowerShell 中运行 Windows 批处理脚本(.cmd 文件),PowerShell 会运行 cmd.exe 并传入批处理文件以供执行。

  • Shell 环境特定命令是在外部文件中定义的命令,只能在 shell 的运行时环境中使用。其中包括脚本和函数,或者它们可以是专门编译的模块,将命令添加到 shell 运行时。在 PowerShell 中,这些命令称为cmdlet(发音为“command-let”)。

  • 运行本机命令

    任何本机命令都可以从 PowerShell 命令行运行。通常,您运行该命令的方式与在 bash 或 cmd.exe 中运行的方式完全相同。以下示例显示在 Ubuntu Linux 上的 bash 中运行 grep 命令。

    sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
    sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
    sdwheeler@circumflex:~$ pwsh
    PowerShell 7.2.6
    Copyright (c) Microsoft Corporation.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

    在 Ubuntu 上启动 PowerShell 后,您可以从 PowerShell 命令行运行相同的命令:

    PS /home/sdwheeler> grep sdwheeler /etc/passwd
    sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
    

    将参数传递给本机命令

    大多数 shell 都包含使用变量、计算表达式和处理字符串的功能。但每个 shell 做这些事情的方式都不同。在 PowerShell 中,所有参数均以连字符 (-) 开头。在 cmd.exe 中,大多数参数都使用斜杠 (/) 字符。其他命令行工具可能没有参数的特殊字符。

    每个 shell 都有自己的在命令行上处理和评估字符串的方法。在 PowerShell 中运行本机命令并期望以特定方式引用字符串时,您可能需要调整传递这些字符串的方式。

    有关更多信息,请参阅以下文章:

    • about_解析
    • about_引用_规则

    PowerShell 7.2 引入了一项新的实验性功能 PSnativeCommandArgumentPassing,该功能改进了本机命令处理。有关详细信息,请参阅 PSNativeCommandArgumentPassing。

    处理输出和错误

    PowerShell 还比其他 shell 拥有更多的输出流。 bashcmd.exe shell 具有 stdoutstderr。 PowerShell 有六个输出流。有关详细信息,请参阅 about_Redirection 和 about_Output_Streams。

    通常,本机命令发送到 stdout 的输出将发送到 PowerShell 中的 Success 流。由本机命令发送到 stderr 的输出将发送到 PowerShell 中的 Error 流。

    当本机命令具有非零退出代码时,$? 将设置为 $false。如果退出代码为零,则 $? 设置为 $true

    然而,这种情况在 PowerShell 7.2 中发生了变化。从本机命令重定向的错误记录(例如使用重定向运算符 (2>&1) 时)不会写入 PowerShell 的 $Error 变量和首选项变量 $ErrorActionPreference 不影响重定向的输出。

    许多本机命令写入 stderr 作为附加信息的替代流。在查看错误时,此行为可能会导致 PowerShell 中出现混乱,并且如果将 $ErrorActionPreference 设置为静音输出的状态,则附加输出信息可能会丢失。

    PowerShell 7.3 添加了一项新的实验性功能 PSnativeCommandErrorActionPreference,允许您控制是否将输出到 stderr 视为错误。有关详细信息,请参阅 PSnativeCommandErrorActionPreference。

    运行 PowerShell 命令

    如前所述,PowerShell 命令称为 cmdlet。 Cmdlet 被收集到可按需加载的 PowerShell 模块中。 Cmdlet 可以使用任何编译的 .NET 语言或使用 PowerShell 脚本语言本身编写。

    运行其他命令的 PowerShell 命令

    PowerShell 调用运算符 (&) 允许您运行存储在变量中并由字符串或脚本块表示的命令。您可以使用它来运行任何本机命令或 PowerShell 命令。当您需要动态构造本机命令的命令行参数时,这在脚本中非常有用。有关详细信息,请参阅呼叫接线员。

    Start-Process cmdlet 可用于运行本机命令,但仅应在需要控制命令执行方式时使用。该 cmdlet 具有支持以下场景的参数:

    • 使用不同的凭据运行命令
    • 隐藏新进程创建的控制台窗口
    • 重定向 stdinstdoutstderr
    • 对命令使用不同的工作目录

    以下示例使用重定向的输入和输出流运行本机命令 sort.exe

    $processOptions = @{
        FilePath = "sort.exe"
        RedirectStandardInput = "TestSort.txt"
        RedirectStandardOutput = "Sorted.txt"
        RedirectStandardError = "SortError.txt"
        UseNewEnvironment = $true
    }
    Start-Process @processOptions
    

    有关详细信息,请参阅启动进程。

    在 Windows 上,Invoke-Item cmdlet 对指定项目执行默认操作。例如,它运行可执行文件或使用与文档文件类型关联的应用程序打开文档文件。默认操作取决于项目的类型,并由提供项目访问权限的 PowerShell 提供程序解析。

    以下示例在默认 Web 浏览器中打开 PowerShell 源代码存储库。

    Invoke-Item https://github.com/PowerShell/PowerShell
    

    有关详细信息,请参阅调用项目。

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯