0

だから私はインターネットからアートのコレクションを持っています。それは非常に大きく、メイン フォルダ (Uda というタイトル) の下に非常に多くのサブディレクトリにまたがっています。このコレクションは、約 4 年間にわたって積み上げてきました。最近の 2 年間、私は保存したものをアーティスト別に整理してきました (これのほとんどは DeviantArt というサイトからのものです)。しかし、2 年分のファイルがあちこちにあり、並べ替えたいと思っています。

これは、バッチ スクリプトを練習するのに理想的な時期だと思いますが、どこから始めればよいかまったくわかりません。Google はあまり役に立ちませんでした。1 つの質問で自分が何をしたいのかを説明するのは難しすぎます。また、私は正直に言って、それを理解してそこから学ぶために、既に作成されたスクリプトをバラバラにして把握することをはるかに好みます (それが私が最もよく学ぶ方法です)。

誰でも私を助けることができますか?何をしたいのかわからない場合: 何か (つまり、アーティストの名前) を入力できるスクリプトを作成し、特定のディレクトリの下にそのフォルダーを作成したいと考えています (バッチがどこから実行されているかに関係なく)。またはそこから抽出されたファイル) を入力された用語の名前で検索し、その用語を含む別のディレクトリの下にあるすべてのファイルを見つけて移動します。

ちなみに、私はバッチ スクリプトに興味がありませんでしたが、Windows エクスプローラーを使用してすべてを検索し、それらを切り取ることはできませんでした。これは、(個人的な理由で) 無効にしたためです。

4

2 に答える 2

1
@ECHO OFF
SETLOCAL
:: Note that SPACES are significant in simple SET statements
:: Set relative or local root (start-point of subtree to scan)
:: Use normal then safemethod 1 then safemethod2 - all do the same thing
:: Note : from the prompt,
:: command /?
:: will generally show help...
SET relroot=c:\wherever
(SET relroot=c:\wherever)
SET "relroot=c:\wherever"
:: repeat for destination directory
SET "destdir=c:\destination"
::
:: Read Artist
:: Make sure ARTISTS has no existing value, then prompt for input
::
:again
(SET artist=)
SET /p artist="Artist ? "
::
:: Check for input, exit if none
:: Note :EOF is a special predefined label meaning "END OF FILE"
:: character case is generally insignificant
::
IF NOT DEFINED artist GOTO :eof
::
:: make a new directory
:: the 2>nul suppresses an error message like 'it already exists'
:: In quotes in case variables contain spaces
MD "%destdir%\%artist%" 2>nul
::
:: Now look for filenames containing the data entered
:: Note: here, the metavariable %%i IS Case-sensitive
:: >nul means 'don't show message like '1 file(s) moved'
FOR /f "delims=" %%i IN ( 
   ' dir /s /b /a-d "%relroot%\*%artist%*" '
   ) DO (
 ECHO %%i
 IF EXIST "%destdir%\%artist%\%%~nxi" (
    ECHO Cannot MOVE "%%i" because "%destdir%\%artist%\%%~nxi" exists
 ) else (ECHO MOVE "%%i" "%destdir%\%artist%\%%~nxi" >nul)
)

GOTO again

さて、これがスターター スクリプトです。アーティストの名前がファイル名に含まれていると仮定します。

ほとんどのドキュメントはインラインです。

::...ドキュメントの形式は実際には壊れたラベルであり、ループや括弧で囲まれたコード内では一般に推奨されないことに注意してください-そこでREMを使用してください。ただし、入力しやすく、邪魔にならない

FORループには少し説明が必要です。その多くは、ドキュメントから少し永続化することで解読できます。

for /?

プロンプトから。しかし、ヘッズアップは次のとおりです。

for /f「ファイル」を 1 行ずつ読み取り、区切り文字間でトークン化された後、連続する各行をメタ変数に適用します。delims=トークンは 1 から数えて数で指定でき、区切り文字はと閉じ引用符の間にある任意の文字です。デフォルトの区切り文字は [スペース]、[タブ]、[カンマ]、[セミコロン] で、デフォルトのトークンは1です。「delims=」は区切り文字がないことを指定しているため、行全体がメタ変数に適用されます。

、 、に適用するために使用するなど、Wed. 07/11/2012データ行でこの機能を使用することができます- トークンは、であり、行が [スペースまたは] を使用してトークン化され、2 番目のトークンがループ メタ変数に適用されると、トークン番号のリストの3 番目から 3 番目まで。特別なトークン " " は、「指定された最大数のトークンに続く行の残り」を意味します。FOR/f "tokens=2,3,4delims=/ " %%i in...07%%i11%%j2012%%kWed.07112012/%%i%%j*

AND.. 一重引用符で囲まれた「ファイル名」は、コマンドの出力です。基本形式dir /s /b /a-d "%relroot%\*%artist%*"のディレクトリリスト (ファイル名のみ)サブディレクトリをスキャンしますが、%relroot% で始まり、ファイル名のどこかに %artist% を持つwarディレクトリ名については言及しません。スペースが存在する場合はすべて引用符で囲みます。/b/s/a-d

于 2013-03-28T15:23:37.343 に答える
1

私はあなたのためにそれを書くつもりはありませんが、ここにあなたが達成しなければならないことの大まかなリストがあります. それらのそれぞれを探してから、それらを組み合わせてみてください

  1. 名前を入力
  2. この名前でディレクトリを作成します
  3. この名前のファイルを見つける
  4. 見つかったファイルをディレクトリに移動します

あなたがしようとしているもののコードを投稿すれば、私は喜んであなたを助けます.

于 2013-03-28T14:36:21.540 に答える