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

2023-12-28

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

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

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


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

上面的代码作为脚本的前缀,使控制台提示用户输入。

Invoke-Expression -Command "<path_to_exe> -install $user $password"

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


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


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

  • There's no这样做的理由, and Invoke-Expression一般应避免 https://blogs.msdn.microsoft.com/powershell/2011/06/03/invoke-expression-considered-harmful/:它会导致引用头痛(就像您的情况一样),但更重要的是,它可能会带来安全风险,并且通常有更好的解决方案。

    • 顺便说一句:不幸的是,即使直接调用,也可能存在围绕空字符串参数和带参数的引用挑战embedded "字符。 - 参见脚注 [1] 和这个答案 https://stackoverflow.com/a/59036879/45375.
  • If you instead invoke the external program directly - as any shell, including PowerShell is designed to do - your problem will likely go away:[1]

& <path_to_exe> -install $user $password

Note: &, PowerShell 的呼叫接线员 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators#call-operator-, 仅当可执行文件的路径被引用时才需要(例如,"C:\Program Files\foo.exe")和/或通过指定variable参考(例如,$HOME\foo.exe);否则,您可以按原样调用可执行文件(例如,调用cmd.exe,使用类似的东西
cmd /c 'echo hi').


分别地,如果您确实发现自己需要转义中的任何字符set字符数,使用-replace with a 字符类 https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference#character-classes, [...]:

Note: This is not necessary for passing arguments, neither to external programs, as shown above, nor to PowerShell commands; however, due to PowerShell's broken handling of " characters embedded in argument values passed to external programs, you may have to escape " characters (only), as \"[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

Note: Since \ has special meaning even inside a character class, it had to be escaped as \\ - all other chars. are used as-is.

欲了解更多信息-replace运算符,参见这个答案 https://stackoverflow.com/a/40683667/45375.


[1] There is one character that still causes problems: embedded ". For historical reasons, PowerShell does not properly pass embedded " correctly to external programs, and annoyingly requires manual \-escaping in Windows PowerShell and PowerShell (Core) versions up to v7.2.x - see this answer https://stackoverflow.com/a/59036879/45375 for details. Applied to your solution:& <path_to_exe> -install $user ($password -replace '"', '\"')

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在PowerShell中转义特殊字符? 的相关文章

随机推荐

  • 无法关闭 Matplotlib 中的科学计数法[重复]

    这个问题在这里已经有答案了 我使用以下代码在 Matplotlib Python 中绘制一个简单的图 temp np array 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 99999999 0 99999999 0 999
  • 多个 Eclipse IDE 应用程序未显示在 Launchpad 上

    我需要有关 Launchpad 上 Eclipse IDE 的帮助 我有 Mac OS X Yosemite 并且下载了 Eclipse IDE Java PHP 和 C C 在我提取 Eclipse IDE Java 并将其拖放到我的应用
  • 无法使用 VS 2022 调试 WSL2 - 无效的“cwd”值

    我尝试在 Windows 中使用 VS 2022 IDE 从 WSL2 进行调试 但出现以下错误 cwd 值确实看起来错误 但如何修复它 我正在使用 netcore 6 0 101 Ubuntu 20 04 3 和 Windows 11 启
  • 垂直对齐在内联块中不起作用

    我想将文本垂直居中 但是 这行不通 当我将文本放入内联块中时 我应该能够将文本垂直居中 对吧 为什么这段代码不起作用 我怎样才能使它起作用 请帮帮我 先感谢您 HTML ul class socialBlock li class socia
  • 通过点击单元格内的图像从 UITableViewCell 中转出

    我已经尝试解决这个问题有一段时间了 经过几个小时的寻找解决方案后 我决定是时候问了 我有一个由自定义 UITableViewCells 填充的表格视图 当前当您点击单元格时 它会将您带到详细视图 自定义单元格内有一个图像 我希望用户能够点击
  • ListView 显示字符串时出现问题

    任何人都可以帮助我在我的应用程序中以列表视图显示一组结果 我得到以下内容 codeList
  • 模拟挂起 lambda 在 Mockito 中返回 null

    依赖关系 testImplementation androidx arch core core testing 2 0 0 testImplementation org mockito mockito core 3 3 0 testImpl
  • 回合制多人骷髅演示应用程序

    我正在尝试让基于回合制多人游戏的演示应用程序正常工作 但遇到了问题 我已经编译并运行了代码 但每当我尝试实际连接或创建游戏时 都会收到此错误 DrawingActivity 13235 没有警告或字符串要处理 6003 该错误代码对应于此
  • 确定 CRAN 上 R 包历史版本的数量

    是否可以确定 CRAN 上的某个包过去拥有的版本数 这是一个使用XML包裹 这只是计算存档版本 更准确地说 是存档版本的数量 tar gz文件 加 1 即可得到版本总数 包括当前版本 nCRANArchived lt function pk
  • 使用相同的方法签名发布和获取

    在我的控制器中 我有两个名为 朋友 的操作 执行哪个取决于它是 get 还是 post 所以我的代码片段看起来像这样 Get AcceptVerbs HttpVerbs Get public ActionResult Friends do
  • PHP 是否有等效的forever.js 来连续运行我的脚本?

    我偶尔使用永远 js https github com nodejitsu forever用于将 CLI 类型的 Node js 应用程序快速而肮脏地部署到我不希望完全启动的生产环境中监督者 http supervisord org 部署
  • PyQt 无法识别箭头键

    我正在尝试编写一个 目前非常 简单的 PyQt 应用程序 并希望允许用户使用箭头键进行导航 而不是单击按钮 我已经实现了基础知识 并且在我的主要内容中QWidget 我覆盖keyPressEvent 现在 我所要求的就是它发出警报 QMes
  • “‘SELECT *’仅对单个输入集有效。”

    尝试学习沙箱中的查询语法 https www documentdb com sql demo https www documentdb com sql demo SELECT food id FROM food JOIN t in food
  • 使用 WPF C# 创建后台热键的正确方法? (最好不使用遗留代码)

    我需要能够为 WPF 应用程序设置后台热键事件 通过背景 我的意思是所讨论的应用程序可能不一定是焦点 我知道使用 WinForms 的正确方法是导入 user32 dll 并使用 RegisterHotKey 并捕获适当的 WM POST
  • 在一场战争中使用多个 CDI 配置文件(开发、测试版、质量保证、生产)?

    拥有使用 Spring DI applicationContext xml 声明依赖注入的方式的经验后 我现在尝试弄清楚如何使用 Java EE6 CDI 执行相同的操作 使用 Spring 我可以将我的 jar 与多个配置文件一起发送 例
  • 当 DEBUG 为 False 时错误处理程序不会触发

    我在用着错误处理程序 http flask pocoo org docs 0 10 patterns errorpages error handlers捕获并处理某些类型的异常 app errorhandler CustomExceptio
  • Android 两个具有相同值的整数不正确相等

    我不是java人 所以我不确定这是否只是一个语言问题 我正在编写一个 Android 应用程序 在应用程序中的某一时刻 我会与整数 版本号 进行比较 以查看它们正在使用的应用程序版本 如果它们不是最新的 则执行某些操作 我注意到我的操作代码
  • 隐藏 Invoke-WebRequest 的进度

    如何隐藏进度显示Invoke WebRequest 我连续提出了很多请求 并有自己的请求Write Progress我使用的显示器 所以我不需要每次都在它下面弹出内置的显示器 我使用从结果创建的 mshtml 结果 IE COM 对象 In
  • 将 CSS 应用于嵌入 img 标签的 SVG 图像

    在我的页面上 我使用 img 标签来嵌入 SVG 图像 现在我想在它们上应用一些CSS 只要将 SVG 源代码直接复制粘贴到页面中 这种方法就很有效 但是 如果我使用 img src 属性嵌入它们 则不会 有办法让它发挥作用吗 img sr
  • 如何在PowerShell中转义特殊字符?

    当我的 PowerShell 脚本运行时 它会提示用户输入密码参数 该密码可以包含任意数量的特殊字符 例如 然后将该密码用作 exe 命令的参数 但由于某些特殊字符未正确转义 该密码通常不正确 过去的密码示例是 我需要转义的唯一字符是 我将