有时,cmd shell 无法扩展通配符路径确实很不方便。我必须将目录中的 100 个文件传递给程序,但无法输入 *.ext。相反,我使用 mingw 的“ls”将列表转储到文件中,然后用空格替换换行符,复制并粘贴到 cmd 中。真是一场噩梦。
我认为答案是否定的,但有人处理过这个问题或想出任何办法让它变得更容易吗?
答案1
DOS 以及 Windows 从来cmd.exe
不支持 shell 的通配符扩展。扩展总是由应用程序来完成。
这意味着,如果您使用的应用程序不支持扩展,您将不得不寻找其他途径。您可以:
- 使用 FOR 循环对你感兴趣的所有文件运行一些命令
- 使用
dir /b > list.txt
命令dir
执行扩展并将文件列表放入文本文件中(如果您确实迫切需要生成要粘贴的命令列表,则可以使用类似 Excel 公式的东西cmd
,或者您可以使用 Excel 转置单元格,以便所有文件名都在同一行。)
答案2
只需使用 Windows 7 上预装的 Powershell。Powershell 能够运行 cmd 命令,并且可以理解路径中任何地方的通配符。
要启动 Powershell,只需在开始菜单搜索框中输入“powershell”并按回车键。
如果应用程序需要一个包含所有文件名的字符串,那么这是正确的脚本:
$delimiter = " "
[string]$files = $nothing ; ls *.txt | % { $files += $_.fullname + $delimiter } ; application.exe $files
如果您的应用程序需要以逗号分隔的文件名列表,请更改$delimiter = " "
为。$delimiter = ","
代码解释:
[string]$files = $nothing
- 创建一个空类型的变量string
;
- 是多个命令的分隔符,而不是管道!ls *.txt | % { $files += $_.fullname + $delimiter }
- 获取所有文本文件的列表,并创建一个字符串,其中所有文件名由分隔符分隔application.exe $files
- 调用应用程序并将文件列表传递给它
-recurse
您甚至可以通过添加来递归地搜索文件模式,ls *.txt
因此完整代码如下所示:
$delimiter = " "
[string]$files = $nothing ; ls *.txt -recurse | % { $files += $_.fullname + $delimiter } ; application.exe $files
编辑:
为了避免引起不快,ls
和dir
是的别名Get-ChildItem
,%
是的别名ForEach-Object
。我保留使用别名的代码,因为这样更短。
编辑2018/04/25:
2012 年的时候,我刚接触 PowerShell。当然还有更简单的方法,尽管它不像 unix/linux 的 glob 扩展功能那么简单:
app.exe $(ls *.txt | % {$_.FullName})
解释:
- $() 将首先评估内部表达式,然后用该表达式的输出替换自身(类似于 bash 中的反引号)
ls *.txt
获取与 glob 匹配的所有文件的 FileInfo 对象*.txt
- 因为 PowerShell 是面向对象的,所以我们必须输出每个 FileInfo 对象的全名。在 PowerShell 中,只需命名一个属性/属性,默认情况下就会输出它。
% { $_.FileName }
为我们做到这一点。%
循环遍历返回的所有元素ls
并输出每个对象的 FileName。
答案3
这将为您提供一个列表,并将其放入名为的变量中expanded_list
。将其放入批处理文件中并使用运行myBatchFile name myPattern
。如果模式包含空格,请用引号括起来。匹配文件,不匹配目录。不带参数运行将匹配所有。
@echo off
set expanded_list=
for /f "tokens=*" %%F in ('dir /b /a:-d "%~1"') do call set expanded_list=%%expanded_list%% "%%F"
echo expanded_list is:
echo %expanded_list%
然后你可以使用以下命令运行my_command_exec %expanded_list%
警告!cmd 变量的最大大小为 8191 个字符(XP 及以上版本),因此可能会溢出!您不能指望该实用程序始终为您提供完整的列表。另一方面,cmd 行的最大长度也是 8191,因此无论如何您都无法执行它。
答案4
这在 cmd.exe 中有效
dir /b *.ext
或者
echo | dir /b *.ext