返回

PowerShell 中通配符作为外部命令文件名的四种应对策略

windows

PowerShell 中使用通配符作为外部命令的文件名

问题陈述

在 Windows 11 中使用 PowerShell 复制 Android 设备中文件时,使用通配符传递文件名会失败,因为 PowerShell 会解释这些通配符。

解决方案

有四种方法可以解决此问题:

  • 使用转义字符.\adb.exe pull /sdcard/\*.json
  • 使用单引号.\adb.exe pull '/sdcard/*.json'
  • 使用 ForEach-ObjectGet-ChildItem /sdcard/*.json | ForEach-Object { .\adb.exe pull $_ }
  • 使用 Invoke-ExpressionInvoke-Expression ".\adb.exe pull /sdcard/*.json"

步骤

使用以下步骤之一:

  • 在通配符前加上反斜杠(\)
  • 将通配符括在单引号内
  • 使用 ForEach-Object 迭代文件并执行命令
  • 使用 Invoke-Expression 将字符串作为命令执行

示例

以下是使用 ForEach-Object 方法的一个示例:

Get-ChildItem /sdcard/*.json | ForEach-Object {
  .\adb.exe pull $_
}

优点和缺点

每种方法都有其优点和缺点:

  • 转义字符 :简单易用,但容易忘记。
  • 单引号 :可靠,但可能导致代码混乱。
  • ForEach-Object :灵活,但可能效率较低。
  • Invoke-Expression :强大,但可能不安全。

选择合适的方法

选择最佳方法取决于具体情况。对于简单的情况,转义字符单引号 就足够了。对于更复杂的情况,ForEach-ObjectInvoke-Expression 更合适。

常见问题解答

1. 为什么 PowerShell 会解释通配符?

PowerShell 将通配符解释为本地文件系统路径,而不是传递给外部命令。

2. 什么是转义字符?

转义字符是一个前缀字符,它允许将特殊字符作为文本解释,而不是作为命令。

3. ForEach-Object 如何工作?

ForEach-Object cmdlet 迭代给定路径中的文件,并为每个文件执行指定的命令。

4. Invoke-Expression 的安全隐患是什么?

Invoke-Expression 可以执行任何字符串作为命令,因此必须确保字符串中的命令是安全的。

5. 我应该使用哪种方法?

根据具体情况选择最佳方法。对于简单的情况,转义字符单引号 就足够了。对于更复杂的情况,ForEach-ObjectInvoke-Expression 更合适。