【问题标题】:Getting the first argument passed to the cli将第一个参数传递给 cli
【发布时间】:2021-11-05 17:26:15
【问题描述】:

尝试编写一个简单的脚本,该脚本将使用传递给我的 ps1 脚本的文件名返回文件的 SHA256 签名:

脚本名称是sha256sum.ps1

第一个参数可以是任何文件,例如:

sha256sum.ps1 dummy.exe

我在sha256sum.ps1 里面试过这些:

Get-FileHash -algo SHA256 %1
Get-FileHash -algo SHA256 $1
Get-FileHash -algo SHA256 $args[1]

但它们都不起作用。

有简单的方法吗?

编辑:感谢你们的帮助,这是我的脚本的最终版本:)

#!/usr/bin/env pwsh
param( $firstArg )

function calcSignature( $filename ) {
    $scriptName = Split-Path -Leaf $PSCommandPath
    switch( $scriptName ) {
        "md5sum.ps1"    { $algo = "MD5";    Break }
        "sha1sum.ps1"   { $algo = "SHA1";   Break }
        "sha256sum.ps1" { $algo = "SHA256"; Break }
        "sha384sum.ps1" { $algo = "SHA384"; Break }
        "sha512sum.ps1" { $algo = "SHA512"; Break }
    }
    (Get-FileHash -algo $algo $filename).Hash + "  " + $filename
}

calcSignature( $firstArg )

现在我只有一个脚本,其他的都是指向sha256sum.ps1的链接。

【问题讨论】:

    标签: powershell arguments command-line-interface


    【解决方案1】:

    我猜你正在寻找“如何将参数传递给你的.ps1 脚本”

    这是脚本 sha256sum.ps1 的外观示例:

    param(
        [parameter(mandatory)]
        [validatescript({
            Test-Path $_ -PathType Leaf
        })]
        [system.io.fileinfo]$File
    )
    
    (Get-FileHash $File -Algorithm SHA256).Hash
    

    现在,如果我们调用这个脚本,例如:

    PS \> .\sha256sum.ps1 .\test.html
    1B24ED8C7929739D296DE3C5D6695CA40D8324FBF2F0E981CF03A8A6ED778C9C
    

    注意:当前目录是脚本和html文件所在的目录,如果不是,请使用绝对路径。


    我建议您到 official docs 了解有关函数和 param(...) 块的概念。

    【讨论】:

      【解决方案2】:

      Santiago's helpful answer 展示了如何正确为脚本声明参数,这通常是可取的。

      至于你尝试了什么

      automatic $args variable 包含未绑定到任何已声明参数的参数。换句话说:如果您的脚本没有声明任何参数,$args 是访问所传递的任何参数的唯一方法。

      第一个参数位于索引0,而不是1

      注意:

      • 这与其他 shell/编程语言不同,其中索引 0 处的元素反映了正在调用的脚本/程序。
      • 因此,例如,批处理文件中的%1bash 脚本中的$1 - 两者都包含第一个参数 - 对应于PowerShell 中的$args[0]

      因此,Get-FileHash -algo SHA256 $args[0] 应该可以工作。

      【讨论】:

      • @SebMa,我是这么认为的。我已经更新了答案,以更明确地解决潜在的困惑。
      • 谢谢。是否有另一个命令可以在没有路径的情况下获取脚本名称?
      • @SebMa,使用Split-Path -Leaf $PSCommandPath
      • @SebMa $MyInvocation.MyCommand.Name 也可以工作
      • @Santiago-Squarzon $MyInvocation.MyCommand.Name 从函数内部调用时返回函数名称。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多