【问题标题】:How to require argument be supplied when script is executed执行脚本时如何要求提供参数
【发布时间】:2021-09-15 19:55:31
【问题描述】:

所以这是我的脚本:

$ans=Read-Host "What process would you like to query?"
Get-WmiObject win32-process -Filter "name='$ans'" | Format-Table HandleCount,VirtualSize,UserModeTime,KernelModeTime,ProcessID,Name

现在我需要创建一个脚本,该脚本需要在执行脚本时传递参数。我对如何成功地做到这一点有点困惑。这就是我正在尝试使用的:

#!/bin/bash
echo $1

Get-WmiObject win32_process -Filter "name='$1'" | Format-Table HandleCount,VirtualSize,UserModeTime,ProcessID,Name

【问题讨论】:

    标签: powershell arguments parameter-passing


    【解决方案1】:

    要在 PowerShell 中设置参数强制(必需),您必须使用advanced script or function;要创建 脚本文件,请将您的代码保存在 .ps1 文件中[1]

    param(
      [Parameter(Mandatory)]
      [string] $Name
    )
    
    Get-CimInstance win32_process -Filter "name='$Name'"
    

    注意:

    • 代码使用 Get-CimInstance 而不是 Get-WmiObject,因为 CIM cmdlet 取代了 PowerShell v3(2012 年 9 月发布)中的 WMI cmdlet。因此,应该避免使用 WMI cmdlet,尤其是因为 PowerShell [Core](版本 6 及更高版本),未来的所有努力都将用于,甚至不再拥有它们。如需更多信息,请参阅this answer

    • 有意省略了Format-Table 调用,因为Format-* cmdlet 只应用于格式化数据以供显示,绝不可用于后续编程处理,即从不用于输出数据 - 见this answer

      • 仅输出 data 意味着 PowerShell 控制数据的显示格式;有关如何控制此格式的信息,请参阅this answer

    [1] 这足以使纯文本文件从 PowerShell 可执行,而无需在调用中包含 .ps1 扩展名。在类 Unix 平台上,您可以通过 shebang 行(例如 #!/usr/bin/env pwshchmod a+x some)创建一个没有文件扩展名的可执行 shell 脚本,也可以从 PowerShell 外部调用。

    【讨论】:

    • 哇,伙计,虽然我知道使用 wmi cmdlet 查询的后果,但我仍然喜欢使用它们。不知道他们和他们一起离开了:(他们只是有这么多真正有用的方法!很高兴知道:)
    • @AbrahamZinala,您仍然可以在Get-CimInstance 返回的对象上调用方法:使用Invoke-CimMethod。务实地说,*-Wmi* cmdlet 不会消失,WMI 将继续支持 Windows 上的 CIM,但值得迁移到 *-Cim* cmdlet 以获得跨本地和远程调用的一致体验,后者利用现代的、防火墙友好的 CIM 远程传输(使用与 PowerShell 自己的远程处理相同的基础架构)
    • 猜猜我从来没有尝试过只运行那些在Get-Ciminstance 中没有显示但在 gwmi 中运行的方法。将使用Invoke-CimMethod 进行尝试。谢谢,第四次快乐!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2014-01-19
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多