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

cem*_*ate 43 windows-7 batch command-line wildcards

有时,cmd shell 无法扩展通配符路径确实会带来不便。我必须将目录中的 100 个文件传递给程序,但无法键入 *.ext。相反,我使用 mingw 的 'ls' 将列表转储到文件中,然后用空格替换换行符,复制并粘贴到 cmd 中。真是一场噩梦。

我怀疑答案是否定的,但有没有人处理过这个问题或想出任何方法让这更容易?

Mal*_*ous 23

DOS 和 Windows'cmd.exe从来不支持 shell 的通配符扩展。始终由应用程序来进行扩展。

这意味着如果您使用的应用程序不支持扩展,您将始终必须找到另一条路线。你可以:

  • 使用 FOR 循环对您感兴趣的所有文件运行一些命令
  • 使用dir /b > list.txt使用dir命令来执行扩张,并把文件的列表到一个文本文件(那么你可以使用像Excel公式,如果你真的绝望产生的命令列表粘贴到cmd,或者你可以使用Excel转置单元格,以便所有文件名都在同一行上。)


wul*_*lxz 10

只需使用 Windows 7 上预装的 Powershell。Powershell 能够运行 cmd 命令,并且可以识别路径中任何位置的通配符。

要启动 Powershell,只需在开始菜单搜索框中键入“powershell”并按 Enter。


如果应用程序需要一个包含所有文件名的字符串,这是正确的脚本:

$delimiter = " "
[string]$files = $nothing ; ls *.txt | % { $files += $_.fullname + $delimiter } ; application.exe $files
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序需要逗号分隔的文件名列表,请更改$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
Run Code Online (Sandbox Code Playgroud)

编辑:
为避免刺激,lsanddir是 的别名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 }为我们做到这一点。%循环遍历由lsFileName返回的所有元素并输出每个对象。

  • 以项目列表作为参数**运行命令**不等同于以列表中的每个元素**作为参数运行命令**多次。另一个例子:`copy a+b+c result`和`copy a result` `copy b result` `copy c result`。(并且在 PS 中确实存在类似 grep 的实用程序,它称为 `select-string`) (5认同)
  • 尽管 PS 肯定能够满足要求并且熟悉它的建议是合理的 - 它并不像您建议的那么简单。运行`start notepad++ *.txt`(打算打开所有文本文件-使用notepad++,因为它**确实**处理多个名称)会让你无处可去 (2认同)

wmz*_*wmz 9

这将为您提供一个列表,并将其放入名为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%
Run Code Online (Sandbox Code Playgroud)

然后你可以运行你的命令 my_command_exec %expanded_list%

警告!cmd 变量的最大大小为 8191 个字符(XP 起),因此它可能会溢出!您不能指望该实用程序始终为您提供完整列表。另一方面,最大 cmd 行长度也是 8191,因此您无论如何都无法执行它。


Ben*_*ick 5

请注意,这是在单独线程 user619818 和 styfle 中对海报的评论)

DIR 可以并且确实允许在所有子目录中搜索与特定类型匹配的文件。

注意:用于检查所有子目录所在的根目录假定为“C:\My Program\Root”,因为作者没有给出这些目录所在的路径名

DIR /B /S "C:\My Program\Root\*.ext"
Run Code Online (Sandbox Code Playgroud)

这将给出源文件的完整文件路径和文件名。

如果您只想要文件名,则必须执行以下操作

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( Echo.%~nxA )
Run Code Online (Sandbox Code Playgroud)

因此,假设您要将所有这些文件从“C:\My Program\Root\Sub Directorys\ .ext”移动到“D:\Singlefolder\ .ext”,您只需执行以下操作:

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( MOVE "%~A" "D:\Singlefolder\%~nxA" /Y )
Run Code Online (Sandbox Code Playgroud)

希望将来能帮助其他人。:)


归档时间:

查看次数:

53108 次

最近记录:

5 年 前