【问题标题】:loop gets stuck when using SET with /P使用 SET 和 /P 时循环卡住
【发布时间】:2017-09-21 14:36:01
【问题描述】:

正如一些人可能知道的那样,我正在编写一个脚本来收集计算机的信息,以使这个过程非常快。不,我有点卡住了,因为我想将解码结果写入文本文件,而不用新行发送垃圾邮件。问题是只要我想添加/p 参数,它就会在第一轮解码后停止。

@echo offsure
set list=89 86 51 84 49 55 52 49 52 49
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
FOR %%X IN (%list%) DO (
    set /p temp=%%~nX
    cmd /c exit !temp:~0,7!
    set temp2=!=exitcodeAscii! 
    echo !temp2!
) >> C:\TestConverters.txt
Echo. >> C:\TestConverters.txt
pause

这是我目前正在使用的源代码。如果我删除 /p 参数它工作得很好。所以现在我实际上只是想改进我在脚本中使用的测试结果,至少已经完成了这一点。

【问题讨论】:

  • 有点臃肿,%%X=%%~nX=!temp!=!temp:~0,7!
  • @DodgyCodeException:它是一个未记录的内部变量,将错误级别转换为 ASCII(列于SS64

标签: loops batch-file variables parameters


【解决方案1】:

set /p temp=%%~nX 将向用户询问名为temp 的变量,提示%%~nX。可能不是你想要的。

我猜你想写!temp2! 没有换行符。
是的,有一个 set /p 的技巧可以这样做,但是 a) 你在错误的地方使用它 b) 你不希望用户输入一些东西(这会暂停你的脚本),但是从 NUL 获取输入而是:

替换

echo !temp2!

<nul set /p =!temp2!

(并删除前行的尾随空格)

根据 Compo 的注释,您的代码可以简化为:

@echo off 
set list=89 86 51 84 49 55 52 49 52 49
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
(
  FOR %%X IN (%list%) DO (
    cmd /c exit %%X
    <nul set /p =!=exitcodeAscii!
  ) 
  echo.
)>>C:\TestConverters.txt
pause

【讨论】:

  • 老兄,非常感谢。现在我只需要过滤掉 var "list" 中的信息,然后我终于完成了最终脚本的设置。真的非常感谢朋友。如果我能为你做任何事,请告诉我。也很好的解释。 :-)
【解决方案2】:

一个简单的例子,如果你真的不需要使用SET/P

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "list=89 86 51 84 49 55 52 49 52 49"
SET "variable="
FOR %%X IN (%list%) DO (CMD/C EXIT %%X
    Set "variable=!variable!!=EXITCODEASCII!")
IF DEFINED variable >"C:\TestConverters.txt" ECHO(%variable%
PAUSE

【讨论】:

  • 可能比使用set /p 方法编写每个字符要快。
  • 这不是速度问题,而是功能问题。如果它对我来说非常好,那么我很高兴。所以我不需要让它更快。它可能只会快 1-10 毫秒,实际上并没有那么多。好像我不必为 1000 万行或值那样做。
  • @M.Stephen,速度不是问题,但效率应该是,在可行的情况下。斯蒂芬斯的观点应该读到我的建议可能更有效。我首先评论了你的问题,斯蒂芬根据我的评论做出了回应,但暗示我后来的回答可能更快。你决定忽略所有这些,转而接受他的回答,这当然是你的褒义词。我认为您在四天后争论他的观点没有任何好处,在我完美的回答之下,同时继续忽略我所做的贡献!
【解决方案3】:

或者你可以试试这个。

 @echo off
 set list=89 86 51 84 49 55 52 49 52 49
 SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
 FOR %%X IN (%list%) DO (
 set temp=%%~nX
 cmd /c exit !temp:~0,7!
 set temp2=!=exitcodeAscii!
 <nul set /p =!temp2!
 ) >> C:\BACKUPS\TestConverters.txt
 Echo. >> C:\BACKUPS\TestConverters.txt
 pause

【讨论】: