查找带有时间戳的文件夹时,可以在CMD中使用通配符吗?

时间:2019-12-05 13:41:26

标签: windows powershell cmd command wildcard

我正在尝试将文件从一个位置移动到使用CMD中的时间戳创建的另一个文件夹。

最简单的形式如下:

move C:\temp\version.txt C:\temp\DB-backup*\version.txt

它给我一个错误,即“文件名,目录名或卷标语法不正确”

我在使用通配符方面真的很陌生,对我来说很多研究对我来说意义不大。非常感谢任何帮助

3 个答案:

答案 0 :(得分:0)

可以在PowerShell中完成

dir C:\temp\DB-backup* | foreach { copy C:\temp\version.txt $_ }

,然后删除源(因为您要“移动”它):

del C:\temp\version.txt 

答案 1 :(得分:0)

简短答案:否:)

长答案:您要执行的操作有点含糊,因为尚不清楚其他文件夹是否具有相同的命名约定。因此,这是一个解决方案,它找到与命名约定“ DB-backup(somestuffafter)”匹配的最新创建的文件夹。

mv version.txt (Get-ChildItem -path C:\temp\checkdirs | where {$_.Name -match "DB-backup(.*)"} | sort -property creationtime -descending | select name -first 1).name

是的,对于单线飞机来说,这有点多了,所以让我们对其进行一些包装:

(                                                  # parens to capture the object
Get-ChildItem -path C:\temp\checkdirs -Directory | # get list of directories
where {$_.Name -match "DB-backup(.*)"} |           # that MATCH the naming convention
sort -property creationtime -descending |          # reverse sort by creationtime
select name -first 1                               # select the first one in the list
).name                                             # then we only want the value of 'name'

MATCH显然要复杂得多,并使用正则表达式处理。如果您只想通过creationtime属性进行隔离,则可以解决此问题。

但是,如果要对实际文件名的部分文本进行排序,则可能需要捕获,将捕获和文件名保存为哈希,然后按捕获对哈希排序,但使用文件名。如果这是您的问题,请提供更多细节。 :)

答案 2 :(得分:0)

在Windows命令提示符(cmd.exe)中,通配符只能在路径的最后一个元素中使用。

要解决此问题,您可以首先使用for /D loop来解析父目录路径,然后构建最终文件路径,如下所示:

for /D %I in ("C:\temp\DB-backup*") do move "C:\temp\version.txt" "%~I\version.txt"

请注意,如果存在多个与模式DB-backup*相匹配的目录,这将尝试多次移动文本文件,但是由于文件已从源位置中删除,因此它将失败。 。如果发生这种情况,您可以复制文件,然后再将其删除:

set "ERR=" & (for /D %I in ("C:\temp\DB-backup*") do copy "C:\temp\version.txt" "%~I\version.txt" & if ErrorLevel 1 set "ERR=#") & if not defined ERR del "C:\temp\version.txt"

if ErrorLevel 1 check检查复制是否成功,如果没有,则设置类似标志的变量ERR;因此,以下命令仅在所有前面的命令都成功的情况下才执行。这意味着,如果至少有一个copy操作失败,则不会删除源文件。

要在批处理文件中使用上述代码片段,请确保将%变量for /D的{​​{1}}符号加倍。