有没有什么办法可以让 windows cmd shell 扩展通配符路径?

有没有什么办法可以让 windows cmd shell 扩展通配符路径?

有时,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

编辑:
为了避免引起不快,lsdir是的别名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

相关内容