0

これが可能かどうかさえわかりませんが、試してみると思いました。

これが私の問題です。複数の大きなハードドライブ(1TB以上)ですべてのイメージを検索し、それらを1つのフォルダーに移動する必要があります。私が抱えている問題は、これをどの言語で書き込もうとしても、答えがわからないようです。robocopyコマンドを使用せずにvbsまたはbat関連にする必要があります。私のドライブのいくつかは、fat32やntfsなどのすべての異なる形式です。バッチファイルで試したいくつかのスクリプトに関する私の問題は、ファイル名が長すぎることでした。したがって、私が行う必要のある主な機能は、画像を見つけてコピーし、存在する場合は_001 _002に名前を変更し、移動したファイルの数を数え、最後にそれらを削除するか、削除するために別のフォルダーに移動することです(私の目にはもう少し安全です)。私はこれに完全に困惑しているので、どんな助けもいただければ幸いです。

これが私が取り組んでいたが停止したばかりのスクリプトの1つです。これに伴う問題は、ファイルをコピーしたが、何らかの理由で拡張子を保持しなかったことです。これは私がオンラインで見つけてコードを少し変更したものでした。私はコードに精通していますが、何らかの理由でこれを理解できないようです。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set TESTFOLDER=allpictures
md "%TESTFOLDER%"


set /a counter=0
FOR /F "tokens=*" %%i IN ('DIR /S /B /A-D C:\Users\user1\Desktop\*.jpg') DO FOR /F "tokens=*" %%j IN ('DIR /B "%%i"') DO IF EXIST ".\%TESTFOLDER%\%%j" (
        set /a counter=!counter!+1
        echo folder: %TESTFOLDER%
        copy "%%i" ".\%TESTFOLDER%\%%j_!counter!"
    ) ELSE copy /B "%%i" ".\%TESTFOLDER%\%%j"
:eof

編集:以下のVBScriptコード

Set fso = CreateObject("Scripting.FileSystemObject")

testfolder = ".\allpictures"
'fso.CreateFolder(testfolder)

CopyFiles fso.GetFolder("E:\")

Sub CopyFiles(fldr)
  For Each f In fldr.Files
    basename  = fso.GetBaseName(f)
    extension = fso.GetExtensionName(f)
    If LCase(extension) = "jpg" Then
      dest  = fso.BuildPath(testfolder, f.Name)
      count = 0
      Do While fso.FileExists(dest)
        count = count + 1
        dest  = fso.BuildPath(testfolder, basename & "_" & count & "." _
          & extension)
      Loop
      f.Copy dest
    End If
  Next

  For Each sf In fldr.SubFolders
    CopyFiles sf
  Next
End Sub
4

3 に答える 3

1

オペレーティングシステムに付属のスクリプトインタープリターで簡単に処理できるものに新しいスクリプトインタープリターをインストールするのはやり過ぎです。

スクリプトが拡張子を維持しない理由は、ファイル名の最後にカウンター変数の内容を追加するためです。そのため、カウンター値は1にfoo.jpgなりfoo.jpg1ます。これを回避するには、修飾子を使用する必要があり%%~njます。ファイルの名前(パスと拡張子なし)、%%~xj拡張子のみ。また、すべてのファイルに対して単一のカウンターは必要ないでしょうが、重複するファイル名ごとに1つのカウンターが必要です。

@echo off

setlocal EnableDelayedExpansion

set TESTFOLDER=allpictures
md "%TESTFOLDER%"

for /f "tokens=*" %%i in ('dir /s /b /a-d C:\Users\user1\Desktop\*.jpg') do (
  call :copyfile "%%~i"
)

goto :eof

:copyfile
set fname=%~nx1
set counter=0

if not exist ".\%dest%\!fname!" goto docopy

:recheck
if exist ".\%dest%\%~n1_!counter!%~x1" (
  set /a counter+=1
  goto recheck
)
set fname=%~n1_!counter!%~x1

:docopy
copy "%~1" ".\%dest%\!fname!"

goto :eof

endlocal

VBScriptでは、次のようなことができます。

Set fso = CreateObject("Scripting.FileSystemObject")

testfolder = ".\allpictures"
fso.CreateFolder(testfolder)

CopyFiles fso.GetFolder("C:\Users\user1\Desktop")

Sub CopyFiles(fldr)
  For Each f In fldr.Files
    basename  = fso.GetBaseName(f)
    extension = fso.GetExtensionName(f)
    If LCase(extension) = "jpg" Then
      dest  = fso.BuildPath(testfolder, f.Name)
      count = 0
      Do While fso.FileExists(dest)
        count = count + 1
        dest  = fso.BuildPath(testfolder, basename & "_" & count & "." _
          & extension)
      Loop
      f.Copy dest
    End If
  Next

  For Each sf In fldr.SubFolders
    CopyFiles sf
  Next
End Sub
于 2013-01-03T23:01:05.660 に答える
-2

perl を使用している場合は、特定のディレクトリ内のすべてのファイルをグロブして、それらを配列に入れることができます。my @Files = glob '<directory>\*.jpg';

ループで各ファイルを通過する foreach $file (@Files){ ... }

各 .jpg は$fileループ内で参照されます。ファイル名を取得し、 my ($originalfilename) = $file;必要な拡張子を追加してから、必要な他のディレクトリにコピー/移動できます。また、そのループでは、カウンター ループをインクリメントするか、配列のスカラー値を取得することができます。

HEREには、perl のドキュメントやチュートリアルがインターネット上にたくさんあります。ファイル操作が一般的な場所になる場合は、基本的な perl を学習する価値があります。

于 2013-01-03T21:34:26.967 に答える