2013-03-17 52 views
2

我有一個問題,從文件重定向輸入到設置/ P集/ 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

這裏的另一種技術,用於讀取使用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 

這裏的優點是沒有必要寫出一個單獨的文件。

但是請注意,任一這些方法中的(集合/ PFOR/F類型)將具有與在輸入文件(特殊的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 

注意,這種方法具有不額外的優勢。「窒息「特殊的外殼字符(shellesc)。

HTH,

比爾

1

如果目的是從文件中讀取文本行,爲什麼需要set/p命令?

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

如果在cmd.exe的命令行鍵入命令,可編寫一%(一個符號%),而不是一個%%(即,在一個外殼腳本中使用時加倍%符號[批次文件])。

比爾

+1

的OP的文件有UTF16內容。這種解決方案的工作原理是因爲TYPE命令會將文件內容轉換爲ANSI。 FOR/F無法直接讀取Unicode文件的內容。 – dbenham 2013-03-17 04:34:16

+0

是的,正如我所說我真的需要第二行,所以我想我必須編寫一個嵌套for循環來選擇它。我希望有一兩個班輪來完成這項任務!這是我最初的靈感: http://stackoverflow.com/a/5523806/2178417 – user2178417 2013-03-20 04:17:15

+0

你可以使用我的其他答案來獲得第二行,而無需擔心編碼(只要type命令正確顯示文件)。只需要替換'if!CURRLINE! EQU 1'與'if!CURRLINE! EQU 2'。另外,請注意您的輸入文件不包含特殊的外殼字符(例如,<, >,|等)。 – 2013-03-20 15:02:06

4

您的文件是以Unicode(UTF-16)格式,和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%}... 
+0

...或按照我的建議,使用單個for/f與type結合使用。對我來說似乎更直接... – 2013-03-17 22:43:22

+0

@AbqBill - 如果OP只需要第一行,則此解決方案更高效。如果讀取整個文件,FOR/F會更直接。在讀取文件時,FOR/F和SET/P各有優缺點。另外,你的回答並不能解釋爲什麼OP的原始代碼不起作用。 – dbenham 2013-03-17 23:13:14

+0

同意,假設你的猜測是正確的。 – 2013-03-18 01:52:57

相關問題