【问题标题】:Can I use a Wildcard in CMD when looking for a folder that has a Timestamp on it?查找带有时间戳的文件夹时,我可以在 CMD 中使用通配符吗?
【发布时间】:2020-03-30 11:09:33
【问题描述】:

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

最简单的形式是这样的:

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

提示“文件名、目录名或卷标语法不正确”

我在使用通配符方面真的很陌生,而且我已经研究过的很多东西对我来说没有多大意义。非常感谢任何帮助

【问题讨论】:

  • 文件或文件夹名称中的日期仅在有多个日期时才有意义(以区分它们)。尝试使用通配符意味着,您要将其复制到所有这些中?

标签: windows powershell cmd command wildcard


【解决方案1】:

可以在 PowerShell 中完成:

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

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

del C:\temp\version.txt 

【讨论】:

    【解决方案2】:

    简短回答:不。:)

    长答案:您尝试做的有点模糊,因为不清楚是否还有其他文件夹具有相同的命名约定。因此,这是一种解决方案,它找到与命名约定“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 属性进行隔离,这可以解决问题。

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

    【讨论】:

    • 感谢您的回答!我最终不得不使用 powershell 来完成我所需要的。我使用的软件有限制,它不能运行 powershell 本身,所以我必须有一个调用 ps1 文件的 cmd 脚本。这主要是我试图避免的。我只是设置了一个 $date 变量并让它搜索以今天日期结尾的文件夹。它最终变得复杂但功能强大:')
    • @Installer:同样可以在cmd 中完成。如果您需要帮助,您必须告诉我们db-backup... 的确切格式(具体的日期是什么样的)。
    • @Installer,请注意 cmd 和 powershell 之间的用户上下文。根据您正在使用的应用程序和安全层,在它们之间切换可能会导致额外的麻烦。我发现的最佳方法是使用 cmd 包装器来调用整个 .ps1。但是如果它需要进出cmd .ps1,那么似乎最好加载单行并增加错误报告。 :)
    【解决方案3】:

    在 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 变量%I% 符号加倍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2016-04-08
      • 2015-08-31
      • 1970-01-01
      相关资源
      最近更新 更多