我正在尝试将文件从一个位置移动到使用CMD中的时间戳创建的另一个文件夹。
最简单的形式如下:
move C:\temp\version.txt C:\temp\DB-backup*\version.txt
它给我一个错误,即“文件名,目录名或卷标语法不正确”
我在使用通配符方面真的很陌生,对我来说很多研究对我来说意义不大。非常感谢任何帮助
答案 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}}符号加倍。