2

ファイルからset/pへの入力のリダイレクトに問題があります

これが私のスクリプトです:

@echo off
echo Reading: {%1}
type %1
echo(
echo Starting...
set VAR=
set /P VAR=<%1
echo VAR is {%VAR%}...

私が使用している構文が機能することを他の場所( https://stackoverflow.com/a/7827243 )で読みました。そうではありません!

これが私の出力です:

Reading: {Fruit.txt}
Pears
Apples
Oranges
Kiwi
Grapes
Kumquat

Starting...
VAR is { ■P}...

だから-何が得られますか?

4

3 に答える 3

4

ファイルはUnicode(UTF16)形式であり、SET/PはUnicodeでは機能しません。TYPEコマンドはUnicodeで機能し、出力をANSIに変換します。TYPEの出力を新しいテキストファイルにリダイレクトすると、SET/Pが機能します。

@echo off
type %1>new.txt
set VAR=
set /P VAR=<new.txt
echo VAR is {%VAR%}...

編集

最初の行の代わりに2番目の行を取得するには:

@echo off
type %1>new.txt
<new.txt (
  set /P VAR=
  set VAR=
  set /P VAR=
)
echo VAR is {%VAR%}...
于 2013-03-17T04:29:41.213 に答える
1

ファイルからテキスト行を読み取ることが目的の場合、なぜset / pコマンドが必要なのですか?

for /f "delims=" %%a in ('type "file name.txt"') do echo %%a

cmd.exeコマンドラインでコマンドを入力する場合は、%% aではなく%a(1つの%記号)を記述します(つまり、シェルスクリプト[バッチファイル]で使用する場合は%記号を2倍にします)。

明細書

于 2013-03-17T03:47:27.147 に答える
0

/fset/pに依存しないタイプを使用して、ファイルの最初の行のみを読み取る別の手法を次に示します。

@echo off
setlocal enableextensions enabledelayedexpansion
set VAR=
set CURRLINE=0
for /f "delims=" %%a in ('type "test.txt"') do (
  set /a CURRLINE+=1
  if !CURRLINE! EQU 1 (
    set VAR=%%a
    goto :DONE
  )
)
:DONE
echo %VAR%
endlocal

ここでの利点は、別のファイルを書き出す必要がないことです。

ただし、これらのアプローチ(/pまたは/ftypeで設定)のいずれかでは、入力ファイル内の特殊なシェル文字(<>|など)で問題が発生することに注意してください。この問題を回避するには、しばらく前に書いたshellesc.exe(http://www.westmesatech.com/sst.html)という小さなユーティリティを使用して、特殊文字を「エスケープ」することができます。ただし、これらのツールを使用する場合は、linex.exeを使用して目的の行を選択し、少し少ないコードで結果を取得することもできます。

@echo off
setlocal enableextensions
set VAR=
for /f "delims=" %%a in ('type "test.txt" ^| linex -l 1 ^| shellesc') do set VAR=%%a
echo %VAR%
endlocal

このアプローチには、特別なシェル文字(shellesc)を「窒息」させないという追加の利点があることに注意してください。

HTH、

明細書

于 2013-03-18T14:52:22.053 に答える