如何将带有.jpg扩展名的所有文件复制到新文件夹?

时间:2017-05-25 14:40:46

标签: batch-file cmd

我正在尝试查找计算机上的所有图片并将它们全部复制到1个文件夹中。这是我在管理员级命令提示符中使用的命令。

C:> dir / s / b * .jpg | findstr / v .jpg> AllPics

出于某种原因,我得到了这个输出:"访问被拒绝。"

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:2)

列出当前目录和所有子目录中JPG文件的完整路径名:

dir /s /b *.jpg

dir命令的标准输出流重定向到findstr命令的标准输入流。排除完整路径名中包含.jpg(区分大小写)的任何文件:

| findstr /v .jpg    

上一个操作的结果似乎是违反直觉的,因为它会否定dir命令产生的大量输出。

findstr命令的标准输出流写入当前目录中名为AllPics的文件(没有文件扩展名):

> AllPics

当前目录似乎设置为C:驱动器的根目录。由于需要管理员权限才能将文件直接保存到C:驱动器的根目录,因此您将收到"访问被拒绝"错误消息。

正如TripeHound所指出的,"访问被拒绝"可能是因为AllPics驱动器的根目录下已存在名为C:的文件夹而导致错误。

获得所需结果的一种方法是将每个JPG文件解析为xcopy命令:

setlocal
set "files=c:\*.jpg"
set "destDir=c:\AllPics"

for /f "delims=" %%f in ('dir "%files%" /b /s') do (
  xcopy "%%f" "%destDir%\"
)

我添加了另一个脚本变体,它改变了要复制的文件的目标名称,以防止可能覆盖任何可能的重复项。

setlocal enabledelayedexpansion
set "files=c:\*.jpg"
set "destDir=c:\AllPics"

for /f "delims=" %%f in ('dir "%files%" /b /s') do (
  for %%d in ("%destDir%\%%~nf*") do (
    set /a count+=1
  )
  xcopy "%%f" "%destDir%\%%~nf!count!%%~xf*"
  set count=
)

由于扩展延迟,脚本的最后一个变体无法处理其完全限定路径名中包含插入符号(^)的文件。

当命令行包含在执行时扩展的环境变量(如此脚本中的count变量)时,整个命令行似乎被解析两次。 for循环变量(%%f及其变体)将在第一次解析期间展开,count变量在第二次解析期间展开。因为for循环变量在第二次解析时已经扩展,所以for循环变量值中出现的任何单个插入符都被解析器吞噬,并从最终结果中省略。

以下是应该解决所述问题的脚本修订版:

setlocal enabledelayedexpansion
set "type=.jpg"
set "source=c:\"
set "dest=c:\AllPics"

for /r "%source%" %%f in ("*%type%") do (
  for %%d in ("%dest%\%%~nf*") do (
    set /a count+=1
  )
  set "source=%%f"
  set "dest=%dest%\%%~nf"
  xcopy "!source!" "!dest!!count!%type%*"
  set count=
)

答案 1 :(得分:-1)

我用WinRAR做到这一点。使用递归扫描归档来自不同文件夹的文件,然后在一个文件夹中提取(使用int cntR = res.Where(y => y.colour == "R" && y.branch == "QWERTY") .Select(z => new { z.Count }) .Concat(new[] { new { Count = 0 } }) .First().Count; 选项,而不是恢复目录树的e