Batch file 打印批处理文件中的特定行
我试图打印第4行,第21-50列的文本文件,这可以简单地在Windows下完成吗?我一直在尝试这样做:Batch file 打印批处理文件中的特定行,batch-file,Batch File,我试图打印第4行,第21-50列的文本文件,这可以简单地在Windows下完成吗?我一直在尝试这样做: FOR /F "usebackq tokens=1 delims=-" %G IN (%COMPUTERNAME%.txt) DO ECHO %G 这真是太糟糕了。我不能只打印一组特定的行吗 我需要在多台计算机上运行此脚本,理想情况下,我希望将其转换为一个变量,以便与slmgr-ipk一起使用,也许有人有更好的建议 文本文件的内容(我想要XXXXX-XXXXX-XXXXX-XXXXX-XXX
FOR /F "usebackq tokens=1 delims=-" %G IN (%COMPUTERNAME%.txt) DO ECHO %G
这真是太糟糕了。我不能只打印一组特定的行吗
我需要在多台计算机上运行此脚本,理想情况下,我希望将其转换为一个变量,以便与slmgr-ipk
一起使用,也许有人有更好的建议
文本文件的内容(我想要XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
部分):
如果您只想要“产品密钥”行,可以尝试使用
type %COMPUTERNAME%.txt|find /i "Product Key"
或
对于手头的任务,这是最合适的方法,因为它不会坚持从文件中提取字符串的固定位置。但是,我想提供一个固定在某个位置的变体 以下代码提取文件
list.txt
第4行第21列到第50列的字符串(结果被回送(包含在中)并存储在变量行\u txt
中(不包含”
):
goto:NEXT
命令在给定行终止for/F
循环;这不是强制性的,但会提高大型文件的性能(只要给定行号非常小)
为了更灵活,可以使用以下代码(在初始集合
块中定义字符串位置):
上述两个代码段都依赖于findstr/N/R.*
,它返回与正则表达式*
匹配的每一行,表示零个或多个字符,而这实际上对文件中的每一行都是正确的;但是,开关/N
定义为在每一行前面加上行号,我提取行号并与最初定义的行号进行比较
下面是另一个变体,它使用for/F
直接循环给定文本文件的内容(行),而不使用findstr
:
@echo off
for /F "usebackq skip=3 eol== delims=" %%L in (
"list.txt"
) do (
set "LINE_TXT=%%L"
goto :NEXT
)
:NEXT
if defined LINE_TXT set "LINE_TXT=%LINE_TXT:~20,29%"
echo."%LINE_TXT%"
此方法具有更好的性能,因为有skip
选项,它跳过对感兴趣行(4)之前的所有行(1到3)的分析和迭代,而不是findstring
变体。
然而,有一个缺点:
for/F
具有一个eol
选项,该选项定义一个解释为行注释的字符(默认为;
);只要delims=
不定义分隔符(选项字符串中的最后一个位置),就无法关闭此选项,这在此处是强制的,以按原样返回行;因此您必须找到一个字符,该字符不作为任何行中的第一个字符出现(我在此处定义了=
,因为您的示例文本文件仅将其用作页眉/页脚字符)
要从第1行提取字符串,请删除skip
选项,因为skip=0
会导致语法错误
请注意,此处需要goto:NEXT
;否则,将提取文件的最后一行(非空)
虽然/F的for
不会迭代文件中的任何空行,但在这里这没有问题,因为skip
选项不会检查行内容,也不会跳过空行
最后,这里还有一种方法使用more+3
,不进行文本解析。但是,这里需要一个临时文件将所需行的文本传递给变量line\u TXT
:
@echo off
set LINE_TXT=
more +3 "list.txt" > "list.tmp"
set /P LINE_TXT= < "list.tmp"
del /Q "list.tmp"
if defined LINE_TXT set "LINE_TXT=%LINE_TXT:~20,29%"
echo."%LINE_TXT%"
exit /B 0
@echo关闭
设置行=
更多+3“list.txt”>“list.tmp”
set/P行\u TXT=<“list.tmp”
del/Q“list.tmp”
如果定义了LINE_TXT,则设置“LINE_TXT=%LINE_TXT:~20,29%”
回显。“%LINE_TXT%”
退出/b0
此方法避免了/F
的,从而避免了上述解决方案中所述的不需要的eol
选项的问题。但是,这无法正确处理选项卡,因为more
将其替换为空格(默认情况下8个缩进空格,可由/Tn
开关配置,其中n
是空格数)。我一直得到“%%#这在当时是意外的。”当我运行for/do命令时,我希望修剪“产品密钥”:此语法用于批处理文件。要在命令提示符下使用,请使用单个%
(%\
而不是%\
)哦,抱歉,修复了cmd,但我现在收到了此错误:|此时意外。请重试。出现了键入错误(缺少插入符号)。这正是我所需要的,现在我只需要找出如何将该输出解析为SLMGR-ipk,以获得一个简单的产品密钥安装脚本,非常感谢!for/f“tokens=2 delims=:“%%#in('type”\\skylab\Library\IT\u Library\Utility\\u keyfinder\%COMPUTERNAME%.txt^ find/I“产品密钥”)do slmgr-ipk%%#
是我在Npcmakai的帮助下需要的命令。我刚刚发现了一种有趣的方法,可以使用more+n
从文本文件中提取某一行。很酷!使用这些命令很有趣,我更喜欢不使用findstr的命令,因为它似乎执行slmgr命令最快,我会尝试tempf为了学习起见,我在第三个示例中使用了一个命令:@echo off for/F“usebackq skip=3 eol==delims=“%%L in”(\\skylab\Library\IT\u Library\Utility\\u keyfinder\%COMPUTERNAME%.txt)do(设置“LINE\u txt=%%L”goto:NEXT):下一个设置“LINE\u txt=%LINE\u txt:~20,29%”slmgr-ipk”%LINE\u txt%
@echo off
for /F "tokens=1,* delims=:" %%L in (
'findstr /N /R ".*" "list.txt"'
) do (
if %%L equ 4 (
set "LINE_TXT=%%M"
goto :NEXT
)
)
:NEXT
if defined LINE_TXT set "LINE_TXT=%LINE_TXT:~20,29%"
echo."%LINE_TXT%"
@echo off
rem Define the string position here:
set FILE_TXT="list.txt"
set LINE_NUM=4
set COL_FROM=21
set COL_UPTO=50
setlocal EnableDelayedExpansion
set /A COL_UPTO-=COL_FROM
set /A COL_FROM-=1
for /F "tokens=1,* delims=:" %%L in (
'findstr /N /R ".*" %FILE_TXT%'
) do (
if %%L equ %LINE_NUM% (
set "LINE_TXT=%%M"
if defined LINE_TXT (
set "LINE_TXT=!LINE_TXT:~%COL_FROM%,%COL_UPTO%!"
)
goto :NEXT
)
)
:NEXT
endlocal & set "LINE_TXT=%LINE_TXT%"
echo."%LINE_TXT%"
@echo off
for /F "usebackq skip=3 eol== delims=" %%L in (
"list.txt"
) do (
set "LINE_TXT=%%L"
goto :NEXT
)
:NEXT
if defined LINE_TXT set "LINE_TXT=%LINE_TXT:~20,29%"
echo."%LINE_TXT%"
@echo off
set LINE_TXT=
more +3 "list.txt" > "list.tmp"
set /P LINE_TXT= < "list.tmp"
del /Q "list.tmp"
if defined LINE_TXT set "LINE_TXT=%LINE_TXT:~20,29%"
echo."%LINE_TXT%"
exit /B 0