我遇到了将文件中的输入重定向到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}...
那么 - 给出了什么?
答案 0 :(得分: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%}...
修改强>
获取第二行而不是第一行:
@echo off
type %1>new.txt
<new.txt (
set /P VAR=
set VAR=
set /P VAR=
)
echo VAR is {%VAR%}...
答案 1 :(得分:1)
如果目的是从文件中读取文本行,为什么需要 set / p 命令?
for /f "delims=" %%a in ('type "file name.txt"') do echo %%a
如果在cmd.exe命令行中键入命令,则应编写%a(1%符号)而不是%% a(即,在shell脚本[批处理文件]中使用时,%符号的两倍)。
比尔
答案 2 :(得分:0)
这是使用 for / f 和类型只读取文件第一行的另一种技术,它不依赖于 set / 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 或 / f 类型)都会遇到特殊shell字符问题在输入文件中(&lt; ,&gt; , | 等)。为了解决这个问题,我可以使用一个名为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
请注意,此方法的另一个优点是不会对特殊的shell字符(shellesc)进行“阻塞”。
HTH,
比尔