返回
PowerShell 中通配符作为外部命令文件名的四种应对策略
windows
2024-03-11 00:58:12
PowerShell 中使用通配符作为外部命令的文件名
问题陈述
在 Windows 11 中使用 PowerShell 复制 Android 设备中文件时,使用通配符传递文件名会失败,因为 PowerShell 会解释这些通配符。
解决方案
有四种方法可以解决此问题:
- 使用转义字符 :
.\adb.exe pull /sdcard/\*.json
- 使用单引号 :
.\adb.exe pull '/sdcard/*.json'
- 使用 ForEach-Object :
Get-ChildItem /sdcard/*.json | ForEach-Object { .\adb.exe pull $_ }
- 使用 Invoke-Expression :
Invoke-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-Object 或 Invoke-Expression 更合适。
常见问题解答
1. 为什么 PowerShell 会解释通配符?
PowerShell 将通配符解释为本地文件系统路径,而不是传递给外部命令。
2. 什么是转义字符?
转义字符是一个前缀字符,它允许将特殊字符作为文本解释,而不是作为命令。
3. ForEach-Object 如何工作?
ForEach-Object cmdlet 迭代给定路径中的文件,并为每个文件执行指定的命令。
4. Invoke-Expression 的安全隐患是什么?
Invoke-Expression 可以执行任何字符串作为命令,因此必须确保字符串中的命令是安全的。
5. 我应该使用哪种方法?
根据具体情况选择最佳方法。对于简单的情况,转义字符 或单引号 就足够了。对于更复杂的情况,ForEach-Object 或 Invoke-Expression 更合适。