set / p不像宣传的那样工作

时间:2013-03-17 03:15:14

标签: batch-file

我遇到了将文件中的输入重定向到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}...

那么 - 给出了什么?

3 个答案:

答案 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,

比尔