208

基本ファイル名のセットがあります。名前「f」ごとに、「f.in」と「f.out」の2つのファイルがあります。すべてのファイル名を処理するバッチファイル(Windows XPの場合)を作成したいのですが、ファイル名ごとに次のようにする必要があります。

  • ベース名「f」を表示します
  • 'f.in'でアクションを実行します
  • 'f.out'で別のアクションを実行します

たとえば、*。in(または* .out)を検索する以外に、ベースファイル名のセットを一覧表示する方法はありません。

4

7 に答える 7

311

process_in.exe と process_out.exe の 2 つのファイルを処理する 2 つのプログラムがあるとします。

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)

%%~nf は、%f をファイル名のみに展開する置換修飾子です。https://technet.microsoft.com/en-us/library/bb490909.aspx (ページの途中) または次の回答で他の修飾子を参照してください。

于 2008-09-02T14:28:51.457 に答える
100

次の行を使用して、デスクトップの内容を印刷できます。

FOR %%I in (C:\windows\desktop\*.*) DO echo %%I 

変数を取得したら%%I、コマンドを実行するのは簡単です (echo という単語をプログラムに置き換えるだけです)。

さらに、FOR 変数参照の置換が強化されました。次のオプションの構文を使用できるようになりました。

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only (directory with \)
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

https://ss64.com/nt/syntax-args.html

上記の例%Iと PATH では、他の有効な値に置き換えることができます。構文は、%~有効な FOR 変数名で終了します。のように大文字の変数名を選択%Iすると、読みやすくなり、大文字と小文字が区別されない修飾子との混乱を避けることができます。

次のように入力すると、完全なドキュメントを取得できます。FOR /?

于 2008-09-02T14:25:00.310 に答える
5

私が見ているように、最も簡単な方法は、処理のために2番目のバッチファイルを呼び出すforループを使用して、その2番目のファイルにベース名を渡すことです。

for /?によると ヘルプ、basenameはnifty〜nオプションを使用して抽出できます。したがって、基本スクリプトは次のようになります。

for %%f in (*.in) do call process.cmd %%~nf

次に、process.cmdで、%0にベース名が含まれていると想定し、それに応じて動作します。例えば:

echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt

1つのスクリプトでこれを行うためのより良い方法があるかもしれませんが、バッチファイルの単一のforループで複数のコマンドをプルする方法については常に少しぼんやりしています。

編集:それは素晴らしいです!どういうわけか、FORループで複数行のブロックを実行できることを示したドキュメントのページを見逃していました。今から戻っていくつかのバッチファイルを書き直す必要があります...

于 2008-09-02T14:18:32.260 に答える
4

Nathansの投稿を拡張します。以下は、1 つのバッチ ファイルでジョブ ロットを実行します。

@echo off

if %1.==Sub. goto %2

for %%f in (*.in) do call %0 Sub action %%~nf
goto end

:action
echo The file is %3
copy %3.in %3.out
ren %3.out monkeys_are_cool.txt

:end
于 2008-09-02T15:10:46.333 に答える
3

forfilesと呼ばれる(私が覚えている限り)MSサーバーで通常使用されるツールがあります:

上記のリンクには、ヘルプと Microsoft ダウンロード ページへのリンクが含まれています。

于 2008-09-02T14:23:40.003 に答える