你可以几乎直接这样做,不需要for循环或其他复杂的方法,只需简单的文件globs。 **
但是,因为? 等于“任何 0 或 1 个字符”,而不是大多数 Windows 命令的“任何一个字符”。因此,您可以轻松地直接选择最多 x 个字符的任何文件。
如果您想复制然后删除任何事后时间不够长的文件,而无需任何循环或其他过程,则以下方法将起作用。
在 CLI 上:
COPY "C:\Source\folder\path\*.*" "C:\Dst\folder\path\"
DEL /F /Q "C:\Dst\folder\path\???.*"
在批处理文件中稍微有点毛茸茸,因为您可能想用它做更多事情:
@(SETLOCAL
ECHO OFF
SET "_Src_Path=C:\Source\folder\path"
SET "_Dst_Path="C:\Dst\folder\path"
SET "_Src_FileGlob=*.*"
SET "_Dst_FileGlob=???.*"
)
COPY "%_Src_Path%\%_Src_FileGlob%" "%_Dst_Path%\"
DEL /F /Q "%_Dst_Path%\%_Dst_FileGlob%"
您可以根据需要使用Robocopy/Move/Dir/Type/Find/FindStr/FOR loops/etc 和File glob。
File Globs 是NOT regex,但仍然可以提供相当大的灵活性,让简单的命令能够完成您的请求等任务,而无需编写任何复杂的脚本。
** 在 Windows 上,您只能使用文件来表示 glob,并且只能使用静态字符,? 表示“任何零个或一个字符”(这实际上是 ? 的正则表达式)*对于“任意字符任意次数”
要做到这一点,您就不会复制任何您不想要的文件,并且必须在之后删除它们(这肯定效率较低,尽管如上所述很容易实现,您可以在命令行:
CLI 作为单行(易于向上箭头并再次运行:
for /F "Tokens=*" %_ IN ('FOR %A IN (C:\Source\folder\path\???.*^) DO @ECHO.%A ^|FindStr /R /C:"^.*\\[^\\][^\\][^\\][^\\][^\\]*$"') DO ( COPY "%_" "C:\Dst\folder\path\" )
CLI 为多行(更易于阅读,仍然可以粘贴):
FOR /F "Tokens=*" %_ IN ('
FOR %A IN (
C:\Source\folder\path\???.*
^) DO @ECHO.%A ^|FindStr /R /C:"^.*\\[^\\][^\\][^\\][^\\][^\\]*$"
') DO ( COPY "%_" "C:\Dst\folder\path\" )
在批处理文件中稍微有点毛茸茸,因为您可能想用它做更多事情:
@(SETLOCAL
ECHO OFF
SET "_Src_Path=C:\Source\folder\path"
SET "_Dst_Path="C:\Dst\folder\path"
SET "_Src_FileGlob=???*.*"
SET "_Dst_FileGlob=???.*"
)
FOR /F "Tokens=*" %%_ IN ('
FOR %%A IN (
C:\Source\folder\path\???.*
^) DO ECHO.%%A ^|FindStr /R /C:"^.*\\[^\\][^\\][^\\][^\\][^\\]*$"
') DO ( COPY "%%_" "C:\Dst\folder\path\" )
另外,正如 Compo 所指出的,只有 Where 符合预期的行为:
在 CLI 中:
for /F "Tokens=*" %_ IN ('WHERE "C:\Source\folder\path:????.*"') DO ( COPY "%_" "C:\Dst\folder\path\" )
在一个简单的脚本中:
@(SETLOCAL
ECHO OFF
SET "_Src_Path=C:\Source\folder\path"
SET "_Dst_Path="C:\Dst\folder\path"
SET "_Src_FileGlob=????*.*"
)
for /F "Tokens=*" %_ IN ('
WHERE "%_Src_Path%:%_Src_FileGlob%"
') DO ( COPY "%_" "%_Dst_Path%\" )