刚刚买了一部新手机,并已临时复制旧的文件到我的电脑C:\ OldPhone \列表文件,这是不是在其他
在我的电脑是我所有的照片,在各种D:\ Photos下面的文件夹。
我想一些代码列出C以下的所有.jpg文件:\ OldPhone \在下面d没有在任何地方:\照片\
这是否有意义?仅仅强调,文件夹结构不完全相同,我不介意文件的位置,只要它在那里。文件名比较会为初学者做,增加大小的选项将是一个奖金!
CMD,VBS或powershell会很好,但视觉工作室可以应付的任何事情都可以。
刚刚买了一部新手机,并已临时复制旧的文件到我的电脑C:\ OldPhone \列表文件,这是不是在其他
在我的电脑是我所有的照片,在各种D:\ Photos下面的文件夹。
我想一些代码列出C以下的所有.jpg文件:\ OldPhone \在下面d没有在任何地方:\照片\
这是否有意义?仅仅强调,文件夹结构不完全相同,我不介意文件的位置,只要它在那里。文件名比较会为初学者做,增加大小的选项将是一个奖金!
CMD,VBS或powershell会很好,但视觉工作室可以应付的任何事情都可以。
试试这个:
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。这不适用于包含=
的文件名。
批处理/ CMD不**具有关联数组。 –
@AnsgarWiechers cmd在他们最近得到的bash之前已经有了这个关联数组。 – Endoro
CMD没有关联数组。最接近的是仿真Rob van der Woude描述[here](http://www.robvanderwoude.com/battech_array.php)。 –
这应该做的伎俩在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
一样,否则可能不需要它。部分名字
Keith,虽然我没有尝试过。 cmd解决方案对我来说简单些。 – FrinkTheBrave
使用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
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
以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
你有没有尝试过任何东西? –