バッチファイルで変数の中身をファイルに出力するにはどうしたらいいでしょうか
例えばDATAという変数の中身をそのまま、OUTPUT_FILE変数が示すファイルに出力したいです
以下ではうまくいきませんでした
echo %DATA%>%OUTPUT_FILE%
ECHO は <ON> です。とでることがあります

A 回答 (2件)

そのままの構文でも、変数のデータが以下の様な感じなら不具合は起きないはずです。



@echo off
set DATA=xxx
set OUTPUT_FILE=OUTPUT_FILE.txt
echo %DATA%>%OUTPUT_FILE%

不具合が起きる原因として考えられるのは、
パスや変数に、特殊な意味を持つ半角記号が含まれる場合です。

「"」「<」「>」「&」「|」「%」と、半角スペースです。

これらは、エスケープをし、文字として認識させる必要があります。

「%」以外の半角記号は、
「^」を使ってエスケープします。

「%」は「%」を使ってエスケープします。
つまり、「%%」と書きます。
コマンドプロンプトで直接打っている場合は、必要ないかも知れません。

例えば、上記の構文を使って、
「&」という文字をファイル出力したいとします。

「set DATA=&」としてしまうと、
「&」は特殊な意味がある記号ですから、うまくセットされません。

「&」をエスケープする為に、「^」を付けて、
「set DATA=^&」とすると、
「DATA」に「&」がセットされた状態にはなりますが、
ファイル出力はうまくいきません。
「echo &>%OUTPUT_FILE%」という状態になっているからです。

うまく「&」をファイル出力するには、
「echo ^&>%OUTPUT_FILE%」という状態にしなくてはいけません。

ですので、変数「DATA」をセットする段階で、
「^」を「^^」とエスケープし、
「&」を「^&」とエスケープし、
「set DATA=^^^&」とすると、
「DATA」に「^&」がセットされた状態になり、
「echo ^&>%OUTPUT_FILE%」となり、
これでやっと「&」がファイル出力されます。

エスケープが面倒な場合は、「"」で囲むと、その間にある半角記号は基本的に文字として認識されますが、「%」と「"」が入っている場合はうまくいきませんので注意が必要です。

「&」を「"」で囲む例は以下の通りです。

set DATA="&"
echo %DATA%>%OUTPUT_FILE%

ただ、これだと、最初と最後に「"」が付いた状態で出力されます。

あと、パスに関しては、
個人的には、全て「"」で囲んだ方が無難だと思います。

変数に入れるパスは、
「"」無しの方が、後々扱いやすいかと思います。
    • good
    • 0
この回答へのお礼

えっと、そのままでは不具合が起きるので質問をしました。
この後いろいろ調べてみましたが、バッチファイルではやりたいことをやるのが難しいことがわかりました
他の方法を考えてみようと思います

お礼日時:2015/12/15 22:33

%DATA%が空もしくは空白だけだとそう(ECHO は <ON>)なりますね。


また、> の直前つまり%DATA%の末尾が一桁の数字の場合もファイルディスクリプタ番号の指定とみなされます。

>%OUTPUT_FILE% echo,%DATA%

のように、
・リダイレクトは行頭に書く
・echoの直後に記号を書く
といいです。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。

ECHO は <ON>がでなくなりました。

お礼日時:2015/12/15 22:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q変数名やサブプロシージャーの名前を英語ではなく日本

VBAにおいて
変数名やサブプロシージャーの名前を英語ではなく日本語でつけると
どのような不具合が発生しますか?
ネット上のサンプルコードなどを見ていると、
Dim i As Long
など、変数名を英字にしてありますが
自分は
Dim 行 As Long
Dim 数 As Long
などにしてしまいます。

このように日本語で変数名をつけると
どのようなデメリット・不具合が発生するのでしょうか?

コードとして見にくいだけですか?
ご回答よろしくお願いします。

Aベストアンサー

日本語を表示できない環境とか、日本語が理解できない人が読む場合とか、そういう自明なデメリットを除くと特にないはずです。

Qバッチファイルで改行の出力

バッチファイルで,改行のみをファイルに追記したいのですがどのようにすればできますか?
echo >> output.txt
とすると「ECHO は <OFF> です。」と出力されてしまいます.
全角を出力すれば見た目は同じですが,純粋に改行のみの出力方法をお願いします.

Aベストアンサー

下記のうちどれでも出来ます。

echo.>> output.txt
echo,>> output.txt
echo:>> output.txt
echo;>> output.txt

Q項目数は英語で

フィールドの項目数を格納する変数を定義したいのですが、
適切な名前が思い当たりません。
項目数は英語でなんていうのでしょうか。
また、変数などを命名する際に参考になりそうなサイトがあればご紹介願います。
よろしくお願いします。

Aベストアンサー

通常、命名規約は変数のスコープとか型を現す接頭語などを定義しますが名称まで定義するのは珍しいです。

まあ、システムでの項目って業種、業態、業界などで取り扱う物が違いますし物によって同じものでも業界用語で呼ばれるものやその会社独特の名称で呼ばれるものがありますので

よくやるのが先頭1文字をスコープとし
g:プロジェクト内参照可能(Global、今はPublicと書きますが)
m:モジュール内参照可能(Module)
l:関数内(Procedure)の変数(Local)
p:関数の引数で指定されたもの(Parameter)

次に型
s:string,i:int,l:long,b:bool,d:date...
場合により2文字とか3文字を使う所もあるようです

プログラム名やフォーム名もシステムが大きくなると
先頭をサブシステム、次に処理タイミング、日次・月次・随時・年次・・・
の後に連番数字をつけて画面名とか
テーブル名も先頭をマスタ、トラン、ワーク・・・などを付ける等等、、、

テーブル等の項目名は最初に名前を付けた人に準じて命名してます。
自分が最初の場合はかなり適当です、極力あとで分かるようにと思ってつけますがやはりテーブルレイアウト参照しながら出ないとPGが作れないですが
YahooとかLivedoorの翻訳サイトで翻訳して適当なものを探しますが一般に使わない英単語を使うと後でなんだこれと思う事も良くありますので英語の苦手な私はローマ字表記がやはり見やすい気もします。
長い名前はコーディング時に面倒なので省略しながら。

ちなみに私ならフィールドの項目数位はローマ字にしないで単純にColCountでしょうね(笑)

通常、命名規約は変数のスコープとか型を現す接頭語などを定義しますが名称まで定義するのは珍しいです。

まあ、システムでの項目って業種、業態、業界などで取り扱う物が違いますし物によって同じものでも業界用語で呼ばれるものやその会社独特の名称で呼ばれるものがありますので

よくやるのが先頭1文字をスコープとし
g:プロジェクト内参照可能(Global、今はPublicと書きますが)
m:モジュール内参照可能(Module)
l:関数内(Procedure)の変数(Local)
p:関数の引数で指定されたもの(Parameter)

次に...続きを読む

Qバッチで削除したフォルダをイベントログに出力したい

Windowsのバッチファイルで、定期的に特定の場所にあるフォルダを
削除したいと考えており、以下のような処理を想定しております。
※OSはWindows Server 2008 R2です。

----------------------------------------
@echo off

rem 1,2,3で始まるフォルダを削除する
for /D %%a in ("C:\test\1*") do rmdir /Q /S "%%a"
for /D %%a in ("C:\test\2*") do rmdir /Q /S "%%a"
for /D %%a in ("C:\test\3*") do rmdir /Q /S "%%a"
----------------------------------------

上記のバッチでフォルダの削除自体はうまくいったのですが、
その際、削除したフォルダの情報をWindowsのイベントログに
Informationとして出力したいと考えております。
イベントログの出力結果は全件まとめてでも一件ずつでも良いのですが、
どのように記載すれば実現できるでしょうか?

Windowsのバッチファイルで、定期的に特定の場所にあるフォルダを
削除したいと考えており、以下のような処理を想定しております。
※OSはWindows Server 2008 R2です。

----------------------------------------
@echo off

rem 1,2,3で始まるフォルダを削除する
for /D %%a in ("C:\test\1*") do rmdir /Q /S "%%a"
for /D %%a in ("C:\test\2*") do rmdir /Q /S "%%a"
for /D %%a in ("C:\test\3*") do rmdir /Q /S "%%a"
----------------------------------------

上記のバッチでフォルダの削除自体はうま...続きを読む

Aベストアンサー

No2です。
>今回のようにfor文で対象を検出・削除している処理の中に、eventcreateコマンドを織り込んで結果を出力する方法がわからなかったのです。
>おそらく、deleteコマンドは標準出力がないため、一回ごとに戻り値を取るようなことをしないと実現できないのだろうと考えております。

それはもとの質問と全く関係のないことですよね。
なぜ知りたいことと全く違うことを質問に書いたのでしょうか?

それはさておき、rmdir が成功したときだけeventcreateしたいのであれば、
mdir /Q /S "%%a" && eventcreate ~~
です。

Qプログラムの変数名にするとどうなりますか

変数になる単語とその英語の直訳です。これらを変数名にしてみてください


宿泊者氏名→Those who stay name
TEL→telNo
備考→Remarks
住所→Address
携帯番号→Mobile phone number
E-mail→E-mail
部屋No→Room No
人数(大人)→Number of people(Adult)
人数(小人)→Number of people(Child)
人数(幼児)→Number of people(Infant)
基本料金(大人)→Basic charge(Adult)
基本料金(小人)→Basic charge(Child)
基本料金(幼児)→Basic charge(Infant)
入湯税→Bathing tax
宿泊開始日→Staying start date

予約金→Reservation money
消費税あり  チェックボックス→Consumption tax
消費税なし  チェックボックス→Consumption tax none
清算日の当日処理を表す変数(ラジオボタン)  →Processing the day before of liquidation day
清算日の前日処理を表す変数(ラジオボタン)  →Processing the day before of liquidation day
清算日の指定日処理を表す変数(ラジオボタン) →Processing on specified day on liquidation day
精算書を作成ボタン→Adjustment book
画面を閉じるボタン→

変数になる単語とその英語の直訳です。これらを変数名にしてみてください


宿泊者氏名→Those who stay name
TEL→telNo
備考→Remarks
住所→Address
携帯番号→Mobile phone number
E-mail→E-mail
部屋No→Room No
人数(大人)→Number of people(Adult)
人数(小人)→Number of people(Child)
人数(幼児)→Number of people(Infant)
基本料金(大人)→Basic charge(Adult)
基本料金(小人)→Basic charge(Child)
基本料金(幼児)→Basic charge(Infant)
入湯税→Bathing tax
宿泊開始日→Staying st...続きを読む

Aベストアンサー

salsberry様の javaでは漢字も使える というのは間違いです。
""で括らない限り、エラーになります。

java 命名規約 で検索されると良いでしょう。

以下は私からのアドバイスです。

複数の単語が並ぶ場合は1つ目以外の単語の頭文字を大文字にして重ねます。
ちなみに長くなりすぎるのは好ましくありません。
意味が通じる最小単位にとどめましょう。
それと、余計な接続詞は省きます。
Mobile phone number → phoneNumber

同じ単語で意味合いが違う場合
そもそも、javaはオブジェクト指向言語です。
変数名で意味合いに違いを持たせる前に、クラスで違いを持たせるべきです。
つまり、
Adultクラス(大人に関する情報をとり扱う)クラス
Childクラス(子供に関する情報をとり扱う)クラス
Infantクラス(幼児に関する情報をとり扱う)クラス
をつくり、
それぞれに peopleNumber と basicCharge という変数を宣言しましょう。

消費税有り無しについては
まずは、
double tax という変数を宣言します。税率の計算はこれをかけるだけ
次に、
消費税ありの定数となしの定数を作りましょう。
public static final double EXIST_TAX = 1.05;
public static final dopuble NONE_TAX = 1.0;
あとは必要に応じて、tax に EXIST_TAX または NONE_TAX を代入しましょう。
この方が後から見て分かりやすいです。

コンポーネントの命名は "どのコンポーネントを使っているか" が重要です。

消費税あり チェックボックス→existTaxCheckBox
消費税なし チェックボックス→noneTaxCheckBox

salsberry様の javaでは漢字も使える というのは間違いです。
""で括らない限り、エラーになります。

java 命名規約 で検索されると良いでしょう。

以下は私からのアドバイスです。

複数の単語が並ぶ場合は1つ目以外の単語の頭文字を大文字にして重ねます。
ちなみに長くなりすぎるのは好ましくありません。
意味が通じる最小単位にとどめましょう。
それと、余計な接続詞は省きます。
Mobile phone number → phoneNumber

同じ単語で意味合いが違う場合
そもそも、javaはオブジェクト指向言語...続きを読む

Qバッチファイルでフォルダ内のファイル数をカウントしたい

こんにちは。よろしくお願いします。

WindowsServer2003環境で、
バッチコマンドで以下のことをしたいと思っています。

(1)特定のフォルダに存在するファイル数をカウント
(2)既定の数あれば何もせず終了、数に相違があればエラーを返す。
(エラーはエラーレベルとSEND MESSAGEの出力)
既定の数は常に決まった数です。

やりたいことは簡単なのですが、
DOSコマンドだけだと方法が思いつきません。。。
VBScriptなどを使わないと無理でしょうか。。。

Aベストアンサー

WindowsServer2003の環境がないで、XPのコマンドプロンプトで作ってみました^^;
参考になればいいですが・・・

規定の数はとりあえず10としています。
カレントディレクトリの(ディレクトリ含む)ファイルをカウントしています。

@echo off

set i=0
for /D %%f in (*) do set /a i=i+1

if %i% lss 10 goto Short:

echo ファイルが%i%個あります、
echo ファイルが10個以上のときの処理を行います。

goto Exit:
:Short

echo ファイルが%i%個しかありません、
echo ファイルが10個未満のときの処理を行います。

:Exit

Q距離と道のりの英語での表現について

プログラムの変数名で悩んでいるのですが英語で直線の「距離」と道に沿った「道のり」を使い分けるにはどのようにしたらよろしいでしょうか?

Aベストアンサー

 どちらもdistanceと言います。

 journeyだと道に沿った距離は言っても、直線距離には使わないようです。こちらを道程という意味の変数に使ってはどうでしょう?

 直線距離なら、airline-distance, direct-distance, linear-distance, rectilinear-distance, straight-line-distanceのどれかを変数名にしてはどうでしょう?

Qバッチファイルでアクセスパスワードが必要なフォルダ内ファイルを開きたい。

Windows Vista Ultimateを使用しています。

サーバーの共有フォルダ内に開きたい「123.xlsx」があります。
この共有フォルダを開くためにIDとPASSが必要になっています。

バッチファイルでファイルを開くにはどのように記述したらよいのでしょうか?

"C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
"\\サーバ名.ドメイン名\フォルダ名\123.xlsx"
上記を一行で書いています。

このままですと当然「アクセス拒否」されてしまいます。
(一度 ID&PASS入力後は上記batで開くことができます。)

ネットワークドライブをマウントして開く等で使った
/user:ユーザー名 パスワード
を使ってみたのですが、ダメでした。

どのように記述したらよいのでしょうか?
ご存知の方いらっしゃいましたら、よろしくお願いいたします。

Aベストアンサー

XP以降のWindowsであれば、ユーザ名とパスワードを入力する際に「パスワードを保存する」にチェックを入れればそれ以降の接続でユーザ名を聞かれる事は無いと思うのですが、保存したくない状況なのでしょうか。

そうであれば、ご質問文に回答の一部が入っていますが、ネットワークドライブを一時的に割り当てて、Excelの終了後に切断する方法が使えるでしょうか。

例:
net use f: \\サーバ名.ドメイン名\フォルダ名 /user:ドメイン名\ユーザ名 パスワード
"C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" f:\123.xlsx
net use f: /delete

参考URL:http://www.atmarkit.co.jp/fwin2k/win2ktips/265stdcliaccess/stdcliaccess.html

Q時刻と時間を明確に区別したい時の変数名

変数名の付け方(英語)でお聞きしたいことがあります。

時刻 ・・・ 整数値 (0~2359)
時間 ・・・ 整数値 (0~上限無し)

という2つの概念があり、これらの変数名を明確に区別して付けたい時、
皆さんはどんな英単語を使いますか?

timeだとどっちだか分からないのでちょっと悩んでます。
でも、英語には時刻と時間を明確に区別する単語って無いですよね?

Aベストアンサー

例えば下記の単語で使い分けるのはどうでしょうか。

time:〔連続{れんぞく}した〕時間  (http://eow.alc.co.jp/time/UTF-8/)

term:〔限られた〕期間{きかん}、時間{じかん}  (http://eow.alc.co.jp/term/UTF-8/)

alcのサイトで調べた時の意味から抜粋しています。
(http://www.alc.co.jp/index.html)

参考URL:http://www.alc.co.jp/index.html

Qバッチファイルのfor文を使ってファイルサイズをMbyteで表したい。

バッチファイルのfor文を使ってファイルサイズをMbyteで表したい。(WindowsXP)

for文を使って、フォルダー内のファイル名とサイズ一覧を作ろうとしています。

1)for %%i in (c:\test\*.*) do echo %%i %%~zi>> c:\test\testfiles.txt

で一応はできたのですが、これではファイルサイズがわかりにくいので、メガバイト単位にしたいのです。(だいたいわかればいいので1024で割るとかはしない)

2)for %%i in (c:\test\*.*) do echo %%i %%~zi/1000000>> c:\test\testfiles.txt
3)for %%i in (c:\test\*.*) do set /a x=%%~zi/1000000 & echo %%i %%x>> c:\test\testfiles.txt
としてもうまくいきません。

%%~ziが数値でなく文字列のため、だと思うのですが、3)は%の付け方とかも間違ってそう。
どう書けばメガバイト単位で一覧を出せるでしょうか?

あれ?
4)for %%i in (c:\test\* ) do if %%~zi GEQ 1000000 echo %%i>> c:\test\testfiles.txt
とすれば1メガ以上のファイル名一覧が出ますね。 ということは%%~ziは数値なのか。

 どなたか、どこが間違っているのか教えていただけないでしょうか

バッチファイルのfor文を使ってファイルサイズをMbyteで表したい。(WindowsXP)

for文を使って、フォルダー内のファイル名とサイズ一覧を作ろうとしています。

1)for %%i in (c:\test\*.*) do echo %%i %%~zi>> c:\test\testfiles.txt

で一応はできたのですが、これではファイルサイズがわかりにくいので、メガバイト単位にしたいのです。(だいたいわかればいいので1024で割るとかはしない)

2)for %%i in (c:\test\*.*) do echo %%i %%~zi/1000000>> c:\test\testfiles.txt
3)for %%i in (c:\test\*.*) do set ...続きを読む

Aベストアンサー

for文では処理が難しいなら、関数呼び出しに切り替えれば良いのです。
次の例(sample.bat)では、ShowFileSize関数に、第一引数がファイル名、第二引数がファイルサイズを与えます。この関数内であれば、好きなだけ加工ができます。
この例では、バイトサイズ(BSIZE) -> KB -> MBと二段階に加工しています。
ただし、四則演算では、巨大数値(GB)になるとマイナスになります。
そこで、環境変数の最後の3文字を切り捨てることで、回避しています。(KSIZEの計算例)
ファイル・サイズに制限があれば、1024や1000等で割ることも可能です。(MSIZEの計算例)

後は、echo行で、c:\test\testfiles.txtにリダイレクトさせれば、問題解決です。

------ sample.bat -------------------------
@echo off
set ARG1=%1
for %%i in (%ARG1%) do call :ShowFileSize %%i %%~zi
goto :EOF

:ShowFileSize
set NAME=%1
set BSIZE=%2
set /A KSIZE=%BSIZE:~,-3%
set /A MSIZE=%KSIZE%/1000

echo %NAME% %BSIZE%B, %KSIZE%KB, %MSIZE%MB

exit /b
---------- 実行例 ---------------
C:\>sample Y:\vmware\*.zip
win2k3sp2.zip 4101185818B, 4101185KB, 4101MB

for文では処理が難しいなら、関数呼び出しに切り替えれば良いのです。
次の例(sample.bat)では、ShowFileSize関数に、第一引数がファイル名、第二引数がファイルサイズを与えます。この関数内であれば、好きなだけ加工ができます。
この例では、バイトサイズ(BSIZE) -> KB -> MBと二段階に加工しています。
ただし、四則演算では、巨大数値(GB)になるとマイナスになります。
そこで、環境変数の最後の3文字を切り捨てることで、回避しています。(KSIZEの計算例)
ファイル・サイズに制限があれば、1024や1000等で割...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング