2013-07-28 17 views
2

刚刚买了一部新手机,并已临时复制旧的文件到我的电脑C:\ OldPhone \列表文件,这是不是在其他

在我的电脑是我所有的照片,在各种D:\ Photos下面的文件夹。

我想一些代码列出C以下的所有.jpg文件:\ OldPhone \在下面d没有在任何地方:\照片\

这是否有意义?仅仅强调,文件夹结构不完全相同,我不介意文件的位置,只要它在那里。文件名比较会为初学者做,增加大小的选项将是一个奖金!

CMD,VBS或powershell会很好,但视觉工作室可以应付的任何事情都可以。

+0

你有没有尝试过任何东西? –

回答

3

试试这个:

for /r "D:\Photos" %%a in (*.jpg) do set "$%%~na=1" 
for %%a in (C:\OldPhone\*.jpg) do if not defined $%%~na echo %%~a not in d:\photos 

CMD拥有关联数组,像AWK。这不适用于包含=的文件名。

+1

批处理/ CMD不**具有关联数组。 –

+2

@AnsgarWiechers cmd在他们最近得到的bash之前已经有了这个关联数组。 – Endoro

+1

CMD没有关联数组。最接近的是仿真Rob van der Woude描述[here](http://www.robvanderwoude.com/battech_array.php)。 –

2

这应该做的伎俩在PowerShell中”

[email protected]{} # initialize empty hashtable 
dir C:\OldPhone\*.jpg -r -file | Foreach {$ht["$($_.Name):$($_.Length)"] = $_.FullName} 
dir D:\Photos\*.jpg -r file | Foreach {$ht.Remove("$($_.Name):$($_.Length)")} 
$ht # dump remaining hashtable contents 

这也是考虑到的情况下,该文件的大小,你有多个同名的文件。理想的情况下,要真正确保他们是相同的,那么你应该包含MD5文件散列,而不是文件长度,作为每个文件的散列表$ht键的一部分。请注意,-file参数在PowerShell V3中是新增的,除非有一些文件夹与.jpg一样,否则可能不需要它。部分名字

+0

Keith,虽然我没有尝试过。 cmd解决方案对我来说简单些。 – FrinkTheBrave

-1

使用FCIV(和grep):

fciv .\old -r | grep jpg > old.txt 
fciv .\new -r | grep jpg > new.txt 

要获得

old.txt

6d5f1279d4deccbaeef5d074b13ed2f4 .\old\b\100_1608.jpg 
d95e29e2c0172dea438b12c418b09fd3 .\old\b\100_1610.jpg 
19f9cda002c951f7a9f870ce74fb1224 .\old\b\100_1601.jpg 
32b154f796303a8e9caff0c9d55ba713 .\old\b\100_1600.jpg 
26ff43419c4f30764fb015f6d7c869c1 .\old\b\100_1609.jpg 
d95e29e2c0172dea438b12c418b09fd3 .\old\a\100_1610.jpg 
19f9cda002c951f7a9f870ce74fb1224 .\old\a\100_1601.jpg 
32b154f796303a8e9caff0c9d55ba713 .\old\a\100_1600.jpg 

new.txt

545b2121a3af2a8e5aa3c5946b450e87 .\new\c\100_1605.jpg 
02a1638739302f3c17253beaa3fe9c1b .\new\c\100_1603.jpg 
d95e29e2c0172dea438b12c418b09fd3 .\new\c\100_1610.jpg 
19f9cda002c951f7a9f870ce74fb1224 .\new\c\100_1601.jpg 
32b154f796303a8e9caff0c9d55ba713 .\new\a\100_1600.jpg 

使用的模式。ini文件:

[old.txt] 
Format=Delimited() 
ColNameHeader=False 
Col1=MD5 CHAR 
Col2=PATH CHAR 

[new.txt] 
Format=Delimited() 
ColNameHeader=False 
Col1=MD5 CHAR 
Col2=PATH CHAR 

和VBScript:

Option Explicit 

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") 

Dim oDb : Set oDb = CreateObject("ADODB.Connection") 
Dim sCS : sCS  = Join(Array(_ 
    "Provider=MSDASQL" _ 
    , "Driver={Microsoft Text Driver (*.txt; *.csv)}" _ 
    , "DBQ=" & goFS.GetAbsolutePathName("..\data") _ 
), ";") 
Dim sSQL : sSQL = "SELECT O.* FROM [old.txt] O LEFT JOIN [new.txt] N ON O.MD5 = N.MD5 WHERE N.MD5 IS NULL" 
oDb.Open sCS 
Dim oRS : Set oRS = oDb.Execute(sSQL) 
If Not oRS.EOF Then WScript.Echo oRS.GetString(2, , "|", vbCrLf, "NULL") 
oDB.Close 

输出:

6d5f1279d4deccbaeef5d074b13ed2f4|.\old\b\100_1608.jpg 
26ff43419c4f30764fb015f6d7c869c1|.\old\b\100_1609.jpg 

ADDED:

通过使用

Dim sSQL : sSQL = "SELECT O.*, N.PATH FROM [old.txt] O INNER JOIN [new.txt] N ON O.MD5 = N.MD5" 

你可以得到重复:

d95e29e2c0172dea438b12c418b09fd3|.\old\a\100_1610.jpg|.\new\c\100_1610.jpg 
d95e29e2c0172dea438b12c418b09fd3|.\old\b\100_1610.jpg|.\new\c\100_1610.jpg 
19f9cda002c951f7a9f870ce74fb1224|.\old\a\100_1601.jpg|.\new\c\100_1601.jpg 
19f9cda002c951f7a9f870ce74fb1224|.\old\b\100_1601.jpg|.\new\c\100_1601.jpg 
32b154f796303a8e9caff0c9d55ba713|.\old\a\100_1600.jpg|.\new\a\100_1600.jpg 
32b154f796303a8e9caff0c9d55ba713|.\old\b\100_1600.jpg|.\new\a\100_1600.jpg 

(参见same approach, similar problem

0
For /R %%i In (newfiles\*.jpg) Do Call :Check "%%~fi" 
GoTo :EOF 

:Check 
For /R %%i In (existingfiles\*.jpg) Do If /I "%%~nxi"=="%~nx1" GoTo :Found 
Echo File %1 doesn't already exist! 
GoTo :EOF 

:Found 
Echo File %1 already exists! 
GoTo :EOF 
0

以Endoro的回答为基础,我结束了这个。我真的应该把文件夹的位置放入变量中,但它现在可以工作,所以我就需要这些!我也应该把setlocal ... endlocal行放入一个子例程中。 现在我看看它,OLDFOLDER也是一个愚蠢的名字。这是糟糕的编码!

它将任何缺少的.jpg或.mp4文件复制到文件夹中以便于复制。

echo off 
set OLDFOLDER=C:\OldPhone 
cls 
echo Checking for files in %OLDFOLDER% which aren't in D:\Pictures 
del /f /q "D:\Documents\MissingFiles\*" 
setlocal 
for /r "D:\Photos" %%a in (*.jpg) do set "$%%~nxa=1" 
for /r "%OLDFOLDER%" %%a in (*.jpg) do if not defined $%%~nxa copy "%%~a" "D:\Documents\MissingFiles\" 
endlocal 
setlocal 
for /r "D:\Photos" %%a in (*.mp4) do set "$%%~nxa=1" 
for /r "%OLDFOLDER%" %%a in (*.mp4) do if not defined $%%~nxa copy "%%~a" "D:\Documents\MissingFiles\" 
endlocal 
if exist "D:\Documents\MissingFiles\*.*p*" (
    echo Files missing from D:\Photos copied to D:\Documents\MissingFiles\ 
) else (
    echo There are no files in %OLDFOLDER% which aren't in D:\Photos 
) 
pause 
相关问题