获取传递给 cli 的第一个参数
Getting the first argument passed to the cli
尝试编写一个简单的脚本,使用传递给我的 ps1 脚本的文件名 return 文件的 SHA256 签名 :
脚本名称是 sha256sum.ps1
。
第一个参数可以是任何文件,例如:
sha256sum.ps1 dummy.exe
我在里面试过这些 sha256sum.ps1
:
Get-FileHash -algo SHA256 %1
Get-FileHash -algo SHA256
Get-FileHash -algo SHA256 $args[1]
但其中 none 有效。
有没有简单的方法可以做到这一点?
编辑:这是我脚本的最终版本,感谢你们的帮助,伙计们:)
#!/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
的链接。
我猜您正在寻找 “如何将参数传递给您的 .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(...)
块的概念。
展示了如何正确地为脚本声明参数,这通常是可取的。
至于你试过的:
automatic $args
variable 包含未绑定到任何已声明参数的参数。换句话说:如果您的脚本没有声明任何参数,$args
是访问传递的任何参数的唯一方法。
第一个参数位于索引 0
,而不是 1
。
注:
- 这不同于其他 shell/编程语言,其中索引
0
处的元素反映了被调用的脚本/程序。
- 要在 PowerShell 中获取封闭脚本的完整路径,请使用 automatic
$PSCommandPath
variable.
- 因此,例如,批处理文件中的
%1
和 bash
脚本中的 </code> - 两者都包含 <em> 第一个参数 </em> - 对应于 PowerShell 中的 <code>$args[0]
。
因此,Get-FileHash -algo SHA256 $args[0]
应该有效。
尝试编写一个简单的脚本,使用传递给我的 ps1 脚本的文件名 return 文件的 SHA256 签名 :
脚本名称是 sha256sum.ps1
。
第一个参数可以是任何文件,例如:
sha256sum.ps1 dummy.exe
我在里面试过这些 sha256sum.ps1
:
Get-FileHash -algo SHA256 %1
Get-FileHash -algo SHA256
Get-FileHash -algo SHA256 $args[1]
但其中 none 有效。
有没有简单的方法可以做到这一点?
编辑:这是我脚本的最终版本,感谢你们的帮助,伙计们:)
#!/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
的链接。
我猜您正在寻找 “如何将参数传递给您的 .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(...)
块的概念。
至于你试过的:
automatic $args
variable 包含未绑定到任何已声明参数的参数。换句话说:如果您的脚本没有声明任何参数,$args
是访问传递的任何参数的唯一方法。
第一个参数位于索引 0
,而不是 1
。
注:
- 这不同于其他 shell/编程语言,其中索引
0
处的元素反映了被调用的脚本/程序。- 要在 PowerShell 中获取封闭脚本的完整路径,请使用 automatic
$PSCommandPath
variable.
- 要在 PowerShell 中获取封闭脚本的完整路径,请使用 automatic
- 因此,例如,批处理文件中的
%1
和bash
脚本中的</code> - 两者都包含 <em> 第一个参数 </em> - 对应于 PowerShell 中的 <code>$args[0]
。
因此,Get-FileHash -algo SHA256 $args[0]
应该有效。