ファイルの内容をバッチファイルの変数に読み込む方法は?


161

このバッチファイルは、ビルドをTESTからLIVEにリリースします。このファイルにチェックコンストレイントを追加して、特定のフォルダーに付随するリリースドキュメントがあることを確認します。

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"        
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
del "\\liveserver\liveapp$\web.config"
ren "\\liveserver\liveapp$\web.live.config" web.config

だから私はこれを達成する方法についていくつか質問があります...

  1. あるversion.txt内のファイル\\testserver\testapp$フォルダには、このファイルの内容だけではビルド番号です(例えば、45 -ビルド45のために)どのように私はの内容読みますversion.txtバッチファイル内の変数にファイルを?

  2. \\fileserver\myapp\releasedocs\ {build}.doc{build}の代わりにパート1の変数を使用してファイル、が存在するかどうかを確認するにはどうすればよいですか?

回答:


300

ファイルの内容を変数に読み込みます。

for /f "delims=" %%x in (version.txt) do set Build=%%x

または

set /p Build=<version.txt

どちらもファイル内の1行だけで同じように動作します。複数行の場合、forバリアントは最後の行を変数に入れset /p最初の行を使用します。

変数の使用–他の環境変数と同じように–それは結局のところ1つです。

%Build%

存在を確認するには:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...

ただし、UNCパスが許可されていない場合もあります。現在これをテストすることはできませんが、これを覚えておいてください。


4
このsetメソッドは約1024文字しか読みませんが、それはなぜですか?
イリアンオノフレ2014

12
おそらく内のバッファの制限が原因cmdです。信頼できるスクリプトにとって恐ろしい言語です。
ジョーイ14

ファイル内の文字列を置き換えるのに何時間も苦労しました:|
Iulian Onofrei 2014

16
@ IulianOnofrei、1023のワイド文字(2046バイト)を読み取るためにスタックに割り当てられたバッファーを使用してset /p呼び出しcmd!ReadBufFromInputます。OEM / ANSI文字ごとに1バイトと想定して、ファイルから1023バイトを読み取りますが、現在のコードページを使用してファイルをデコードします。これは必ずしもOEM / ANSIであるとは限りません。最悪のケースはコードページ65001と4バイトのUTF-8文字で埋められたファイル(たとえば、古代のスクリプト)です。255文字に加え、部分的にデコードされた文字が置換文字U + FFFDとして保存されます。
Eryk Sun 2014

3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") ...help forちなみに、これについて言及しています。
Joey

46

次のようにして、ファイルから複数の変数を読み取ることができます。

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H

ここで、param.txt:

PARAM1=value1
PARAM2=value2
...

1
これは完璧なソリューションです。OPに文字通り答えるには、そうである(param.txt)必要が(version.txt)ありますBuild=45
robotik

これは、ソリューション。
JAIL 2017

3
現時点では%% Gは予期されていませんでした。
ジョン

4
@ジョン:コマンドラインで直接使用するために、すべてのを交換%%Gして%G
ステファン・

32

ただ:

type version.txt

入力したように表示されます:

set /p Build=<version.txt
echo %Build%

4
私はthatsの必要なものため@jeb私はイムはまだtypeコマンドに感謝のことを知っているが
MSM

タイプバージョンを提供していただきありがとうございます。共有ディレクトリにあるファイルのコンテンツにアクセスして、私が必要とするものとまったく同じように機能します。
Tastybrownies

22

ファイルのすべての行を変数にロードするには、遅延拡張が必要な​​ので、次のようにします。

SETLOCAL EnableDelayedExpansion

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x

そこにいくつかの特殊文字での問題は、しかし、特に、あり;%そして!


set式全体を二重引用符で囲むと、少なくともいくつかの特殊文字の問題を回避できますset "Build=!Build!%%x"
aschipfl 2015

9
私のスクリプトは「エコーがオンです」とだけ表示します。なぜバッチコンプリートガベージなのですか?
Trevor Hickey

遅延拡張なしで機能します:( set err=次の行)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet 2018年

2
なぜバッチコンプリートガベージなのですか?...一貫性のため?
Jan Nielsen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.