QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

バッチファイルで関数は使えるのでしょうか?

自分のPCから動作させるバッチファイルを作成しています。
バッチファイル初心者です。

set A=NAME_1

処理B(変数Aの値を使用する)

set A=NAME_ABC

処理B(変数Aの値を使用する)


変数Aの設定値には規則性は無い為、LOOP処理は使えないと思っています。
処理Bを関数化したいと考えていますが、どのようなコマンドがあるのでしょうか?
ご教授お願い致します。

質問者:未記入

回答

変数Aの設定値には規則性は無い為、LOOP処理は使えないと思っています。

規則性がないからといって、Loop が使えないとは早計。
対象の List を Text としてもたしておいて、標準入力から読み込ませ、
Loop してやればできます。

help にももろに例文がのっています。
# とはいえ、複雑なのは、Batch では面倒なので WSH でやってしまうことが
# 非常に多いです。

投稿者:ちゃっぴ

編集 履歴 (0)

変数Aの設定値には規則性は無い為、LOOP処理は使えないと思っています。

http://forum.nifty.com/fpcu/dosvcmd/batch.htm#for

の IN (セット) のセットには 「規則性は無い」 並びも 書けます。

MSH(Monad) では function があります。

書き方で
コマンドプロンプトをいじめてはいけません
本気で作ったとは思えないものなのですから
(その事情は知らないですが)
[ メッセージ編集済み 編集者: MMX 編集日時 2006-02-24 14:35 ]

投稿者:MMX

編集 履歴 (0)

FOR構文を使用したいのですが、DO以下のコマンドが複数行の為、
改行して書こうとするとうまくいきません。

FOR %%A IN (A B C) DO echo %%A start
echo %%A end

%%A endは出力されません。
改行などの位置に決まりはあるのでしょうか?

投稿者:未記入

編集 履歴 (0)

forの中に複数のコマンドを入れる場合は、括弧でくくります

FOR %%A IN (A B C) DO (
echo %%A start
echo %%A end
)

投稿者:coasm

編集 履歴 (0)

こんばんわ。初めまして。

無理に1つのバッチファイルで処理するのでなく。
バッチファイルからバッチファイルを呼び出せば実現できると考えますが。

イメージ

 FOR %%A IN (A B C) DO cmd.exe /p job.bat %%A
 
 job.bat の中身
 echo %1 start

  必要な処理を記述

 echo %1 end

所詮MS-DOSの時代の人の作業をスクリプト化するのが目的です。元々「複数行を実行する」という概念がない時代の代物です。
C言語が登場した後に生まれたUNIXのシェルのような期待をもっても無理があるかと考えます。

_________________ではでは。(^^/ 利休タヌキのxvi30ss

投稿者:xvi30ss

編集 履歴 (0)

複数のコマンドをまとめるときは、丸括弧でくくる必要があります。
if〜elseなら、

if 条件 (
コマンド1
コマンド2
) else (
コマンド3
コマンド4
)

ただし、else と開き括弧の間にスペースがないとエラーになりますが(笑)

DOSのcommand.comと比べると、Windowsのcmd.exeは大幅に拡張されています。
(互換性にこだわったために色々と奇妙な仕様になっていて、不便な点も多いが)
あまりバカにしたもんじゃありません。

C言語が登場した後に生まれたUNIXのシェルのような期待をもっても無理があるかと考えます。

C言語やUNIXのシェル(Borne shell)は1970年代、MS-DOSは1980年代の誕生です。
DOSの640KB制限は有名ですが、初期のUnixは64KB制限内で動いていました。
DOSのcommand.comがUnixのshより機能的に大きく劣っているのはその通りですが、
それは時代の差に由来するわけではありません。

投稿者:coasm

編集 履歴 (0)

何度もすいませんm(._.)m。
括弧でくくる方法でうまくいきました。ありがとうございます。

FOR %%A IN (A B C) DO (
echo %%A start
echo %%A end
)

INの中のA,B,Cもホントは数が多い為、改行させたいのですが、
これまたうまくいきません・・・。

FOR %%A IN (
A
B
C
) DO (
echo %%A start
echo %%A end
)

こんな感じでやってみたのですが、これまたダメで・・・。
なにか方法はありますでしょうか?
よろしくお願い致します。

バッチファイルのつくりについて・・・
一つのバッチファイルで行う仕様なのです。すいません。

投稿者:未記入

編集 履歴 (0)

閉じ括弧・DO・開き括弧は、一行に書く
DO と 開き括弧の間には、スペースを入れる必要がある。

# つくづく変な仕様だと思いますが・・・

投稿者:coasm

編集 履歴 (0)

閉じ括弧・DO・開き括弧は、一行に書く
DO と 開き括弧の間には、スペースを入れる必要がある。

↑これは特に決まってはいません。ただ、INの中のA,B,Cを改行できないのでしょうか?
という質問でした。分かりづらくてすいません。

投稿者:未記入

編集 履歴 (0)

バッチファイルは1行1命令が基本的で、括弧をつかうことで複数行に分けられる部分が一部あるという認識でいたほうがいいです。あまり高度なことを期待してはいけません
INの中身が多くて困るのでしたら、中身を別ファイルにしてみてはどうでしょう?
FOR /F %%A IN (ファイル名) DO 〜で行けたはずです。

投稿者:まいるどきゃっと

編集 履歴 (0)

皆さん、ご教授ありがとうございました。
いろんな解決策があることに勉強させられました。

いくつか組み合わせて、試したいと思います。
ありがとうございましたm( )m 。

投稿者:未記入

編集 履歴 (0)

すでに納得されたようですが、

for %%a in (
"A1
A2"
B
) do (

のようにダブルクォートで囲っておくと、
A1とA2が(間に半角スペースをはさんで)結合されて一個の値としてパラメータに渡されます。

残念ながら、区切り文字を入れずに結合する方法はわかりません。

投稿者:coasm

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。

この質問に回答する


この質問の答えをご存知ですか? ぜひ質問者に伝えてあげてください (ログインすると、回答フォームが表示されます)。

ログイン