gpt4 book ai didi

powershell - 如何在 PowerShell 中转义特殊字符?

转载 作者:行者123 更新时间:2023-12-02 22:57:32 29 4
gpt4 key购买 nike

当我的 PowerShell 脚本运行时,它会提示用户输入密码参数。该密码可以包含任意数量的特殊字符,例如 *\~;(%?.:@/
然后将该密码用作 .exe 命令的参数,但由于某些特殊字符没有正确转义,它通常是不正确的。

一个过去的密码示例是 $(?-.?-(。我需要转义的唯一字符是 '(',我将其替换为 '`(' 以使其工作。但是,该密码现在已过期。新密码就像 *\~;~(%?.:@/
*注意:这些密码中也混有随机数字和字母,但已被编辑。

新密码中不是第一个的唯一字符是 *\~;%:@/
有没有一种简单的方法可以转义所有字符并按原样接受任何用户输入?如果没有,有人介意帮我逃脱这些特殊字符吗?

param (
[Parameter(Mandatory=$true)][string]$password
)

上面的代码位于脚本的前面,使控制台提示用户输入。
Invoke-Expression -Command "<path_to_exe> -install $user $password"

^这是使用该密码参数的命令

我在 Stack Overflow、Reddit 和其他各种编码论坛/博客上尝试了许多其他建议,但都没有奏效。任何帮助深表感谢!

最佳答案

您正在使用 Invoke-Expression调用外部程序 :

  • 没有理由这样做 , 和 Invoke-Expression should generally be avoided :它会导致引用问题(就像你的情况一样),但更重要的是,它可能存在安全风险,通常有更好的解决方案。
  • 顺便说一句:不幸的是,即使使用直接调用,也可能会出现围绕空字符串参数和嵌入 " 的参数的引用挑战。字符。 - 见脚注 [1] 和 this answer .
  • 如果您改为直接调用外部程序 - 任何 shell 程序,包括 PowerShell 旨在执行 - 您的问题可能会消失 :[1]
  • & <path_to_exe> -install $user $password

    注: & , PowerShell 的 call operator , 仅当您的可执行文件的路径被引用(例如, "C:\Program Files\foo.exe" )和/或通过变量引用(例如, $HOME\foo.exe )指定时才需要;否则,您可以按原样调用可执行文件(例如,要调用 cmd.exe ,使用类似 cmd /c 'echo hi' 的内容)。

    另外, 如果您发现自己需要对一组字符中的任何字符进行转义,请使用 -replacecharacter class , [...] :

    备注 :这不是传递参数所必需的,既不是传递给外部程序,如上所示,也不是传递给 PowerShell 命令;然而,由于 PowerShell 对 " 的处理中断传递给外部程序的参数值中嵌入的字符,您可能需要转义 "字符(仅),如 \" [1]。

    PS> 'a*b\c~d;e(f%g?h.i:j@k/l' -replace '[*\\~;(%?.:@/]', '`$&'
    a`*b`\c`~d`;e`(f`%g`?h`.i`:j`@k`/l # all chars. inside [...] were `-escaped

    注意:自 \即使在字符类中也有特殊含义,它必须转义为 \\ - 所有其他字符。按原样使用。

    更多关于 -replace的信息运算符(operator),见 this answer .

    [1] 有一个字符仍然导致问题:嵌入 " .由于历史原因,PowerShell 没有正确传递嵌入式 "正确到外部程序,烦人地需要手动 \ - 转义 - 见 this GitHub issue详情。
    应用于您的解决方案: & <path_to_exe> -install $user ($password -replace '"', '\"' )

    关于powershell - 如何在 PowerShell 中转义特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57965466/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com