cem*_*ate 43 windows-7 batch command-line wildcards
有时,cmd shell 无法扩展通配符路径确实会带来不便。我必须将目录中的 100 个文件传递给程序,但无法键入 *.ext。相反,我使用 mingw 的 'ls' 将列表转储到文件中,然后用空格替换换行符,复制并粘贴到 cmd 中。真是一场噩梦。
我怀疑答案是否定的,但有没有人处理过这个问题或想出任何方法让这更容易?
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})
解释:
ls *.txt 获取与 glob 匹配的所有文件的 FileInfo 对象
*.txt% { $_.FileName }为我们做到这一点。%循环遍历由lsFileName返回的所有元素并输出每个对象。这将为您提供一个列表,并将其放入名为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,因此您无论如何都无法执行它。
请注意,这是在单独线程 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 次 |
| 最近记录: |