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%}...

编辑

要获得第二行而不是第一行:

@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(即,在 shell 脚本 [批处理文件] 中使用时,将 % 符号加倍)。

账单

于 2013-03-17T03:47:27.147 回答
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

这里的优点是不需要写出单独的文件。

但是,请注意,这些方法中的任何一种(set /pfor /f with type )都会在输入文件( <>|等)中出现特殊 shell 字符的问题。为了解决这个问题,可以使用我不久前编写的一个名为 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)。

高温下,

账单

于 2013-03-18T14:52:22.053 回答