Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 打印批处理文件中的特定行_Batch File - Fatal编程技术网

Batch file 打印批处理文件中的特定行

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

我试图打印第4行,第21-50列的文本文件,这可以简单地在Windows下完成吗?我一直在尝试这样做:

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