バッチファイルで変数の中身をファイルに出力するにはどうしたらいいでしょうか
例えば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【Apache】及び、の違いは?

<Files ~ "(?i:\.ini|\.tmp)$">
Order Deny,Allow
deny from all
</Files>

と、

<FilesMatch "(?i:\.ini|\.tmp)$">
Order Deny,Allow
deny from all
</FilesMatch>

また、

<Directory ~ "^/www/.*/[0-9]{3}">
Order Deny,Allow
deny from all
</Directory>

と、

<DirectoryMatch "^/www/.*/[0-9]{3}">
Order Deny,Allow
deny from all
</DirectoryMatch>
は、
どうも同じ挙動をしているように思われます。
(違っていたらご指摘ください。)

Apacheのマニュアルには、
(http://httpd.apache.org/docs/2.0/ja/mod/core.html)

<Files> ディレクティブ の項目を見ると、

//===========================================================
~ という文字を付加することで拡張正規表現を使うこともできます。 例えば、
<Files ~ "\.(gif|jpe?g|png)$">
とすることにより、一般的なインターネットの画像フォーマットにマッチします。 ただし、 <FilesMatch> を使う方が 推奨されています。
//===========================================================

とあるのですが・・・。
(ただ、<DirectoryMatch> を使う方が 推奨されています。とは書いてないようです)

これら、
<Files ~>と<FilesMatch>及び、<Directory ~>と<DirectoryMatch>の違いは、
いったいなになのでしょうか?

ご存じの方いらっしゃいましたら、お教えいただければ幸いです。

<Files ~ "(?i:\.ini|\.tmp)$">
Order Deny,Allow
deny from all
</Files>

と、

<FilesMatch "(?i:\.ini|\.tmp)$">
Order Deny,Allow
deny from all
</FilesMatch>

また、

<Directory ~ "^/www/.*/[0-9]{3}">
Order Deny,Allow
deny from all
</Directory>

と、

<DirectoryMatch "^/www/.*/[0-9]{3}">
Order Deny,Allow
deny from all
</DirectoryMatch>
は、
どうも同じ挙動をしているように思われます。
(違っていたらご指摘ください。)

Apacheのマニュアルには、
(...続きを読む

Aベストアンサー

違いはないでしょう。
Files ~ で表現していた正規表現(~無しのFilesの時は正規表現じゃなくてファイルマッチ)での指定をする専用のディレクティブを作ったということです。
新しい方を使いましょうと言うことだと思いますよ。

Qシェルスクリプトだと動かない [ -L fileS ] && echo "シンボリックリンクです"

コマンドライン上で
カレントディレクトリにある fileS がシンボリックリンクであるか調べる事ができるか、学習しております。コマンドライン上で
[ -L fileS ] && echo "シンボリックリンクです"
と打つと、動作する事を確認しました。
しかし、シェルスクリプトで(slink.sh)
=======================

#!/bin/sh
[ -L fileS ] && echo "シンボリックリンクです"

=======================
と、同ディレクトリにスクリプトファイルを作成。
chmod ug+x slink.sh して
./slink.sh と打つと
slink.sh: test: 引数が足りません。
と怒られます。
どこがどのように間違っているかわからないので
ご教授いただけないでしょうか
お願い致します。

Aベストアンサー

Debian Linux kernel 2.6.21.4で確認しましたが、ちゃんと動きました。

#! /bin/sh
test -L fileS &&echo "シンボリックリンクです"
と書いてもエラーになるのでしょうか?

Qecho "1.1" > ~/.vagrant.d

echo "1.1" > ~/.vagrant.d/setup_version
と同じことをWindowsコマンドでは、どう書くのでしょうか?

Aベストアンサー

mkdir %USERPROFILE%\.vagrant.d
echo "1.1" > %USERPROFILE%\.vagrant.d\setup_version

先にフォルダを作らないといけないのでどうしても2行になりますね。
%USERPROFILE%はユーザプロファイルのフォルダの場所でこの下にXPで言う
MyDocumentsなどのフォルダやらが収まる場所です。

Qechoで「-n」を出力する方法

echoで「-n」を出力するようにしたいのですが、
echo -nとすると「-n」がオプションと解釈されて何も表示されませんし、
echo -- -nとすると「-- -n」と表示されてしまいます。

echoで「-n」を表示させたい場合はどのように指定すれば良いのでしょうか?
(前後にスペースが入ってしまう、他のコマンドを使うなどはNG)

よろしくお願いいたします。

Aベストアンサー

ネタ的な回答

echo -n -;echo n

Qcronで毎日、ディレクトリ[data]の中身を削除したい。

cronを使って毎日午前0時にディレクトリ[data]の中身を全て消したいのですがどうすればいいでしょうか?サンプル掲載サイトとかあれば嬉しいですm(__)m

Aベストアンサー

man crontabとman 5 crontab(リファレンスマニュアル)の内容では駄目でしょうか?

設定例)
# 毎日0時0分に/PathTo/dateディレクト配下を削除する
0 0 * * * rm -rf /PathTo/date/* > /dev/null 2>&1

※/PathTo/dateはdateディレクトリの絶対パス指定を意味しています。
 例 /tmp/date、/usr/tmp/date等
 


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

人気Q&Aランキング

おすすめ情報