为什么powershell命令在终端中有效,但在lnk文件中无效



例如,此命令在PowerShell提示符下运行良好:

powershell.exe -NoExit -c Set-Variable -Name "CA_HOME" -Value "$(Get-Location).Pathintermed-ca"

但如果从lnk文件中使用,则会失败并出现错误。

Set-Variable : A positional parameter cannot be found that accepts argument 'intermed-ca'.
At line:1 char:1
+ Set-Variable -Name CA_HOME -Value $(Get-Location).Path'intermed-ca'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Set-Variable], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetVariableCommand

为什么?

您提供的错误不是来自该特定命令。请注意,PowerShell正在向我们显示出错的命令。

这个特定的错误只是一个语法错误;这不是连接字符串的方式。仅运行CCD_ 1将给您一个错误:";意外的标记"\在表达式或语句中插入了ca"">

回到您在OP顶部发布的命令,这是正确的语法,但不会是您要寻找的路径,因为逻辑有缺陷。因此,您发布的命令不会产生错误,但会返回一个可能不存在的路径。假设您的工作目录是您的用户配置文件,您将为$CA_HOME:C:UsersZulgrib.Pathintermed-ca返回类似的内容。原因是你基本上是这样做的:

$path = (Get-Location).Path
'{0}.Pathintermed-ca' -f $path

.Path是字符串的一部分,而不是字符串执行。这就是为什么您应该添加括号以确保此属性作为字符串执行的一部分返回:

powershell.exe -NoExit -c Set-Variable -Name "CA_HOME" -Value "$((Get-Location).Path)intermed-ca"

虽然这很好,而且不会出现问题,但从命令行进行引号翻译可能会很棘手所以,这并不是适用于所有场景的完美解决方案。为了更好的兼容性,我习惯于用双引号包装整个命令,并在命令中保留单引号:

powershell.exe -NoExit -c "Set-Variable -Name 'CA_HOME' -Value ('{0}intermed-ca' -f (Get-Location).Path)"

为了获得最佳兼容性,请考虑对命令进行base64编码并使用-EncodedCommand运行它。有关示例,请参见powershell.exe /?的最底部。有些情况下会遇到CLI命令过长的问题,请对此感到厌倦。

注:'{0}intermed-ca' -f (Get-Location).Path'{0}intermed-ca' -f (Get-Location)将给出相同的结果。当PowerShell知道它正在将PSOobject注入字符串时,它会为您提供您可能想要的字符串形式。

相关内容

最新更新