我正在尝试查找计算机上的所有图片并将它们全部复制到1个文件夹中。这是我在管理员级命令提示符中使用的命令。
C:> dir / s / b * .jpg | findstr / v .jpg> AllPics
出于某种原因,我得到了这个输出:"访问被拒绝。"
我该怎么做才能解决这个问题?
答案 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
。