【问题标题】:Set the variable to another variable in the for statement在for语句中将变量设置为另一个变量
【发布时间】:2012-03-23 10:08:43
【问题描述】:

我正在尝试将 for 语句的变量设置为另一个变量。当我这样做时:

for /f "tokens=* delims= " %%p in (plugins.txt) do set pp = %%p

它工作正常。但是我想做更多,所以我在 ( 现在它不起作用。为什么会这样以及我该如何解决它?

for /f "tokens=* delims= " %%p in (plugins.txt) do (
set pp = %%p
echo %pp%
echo %pp%
echo %%p)

编辑:添加输入和所需输出

plugins.txt 的内容
http://subversion/svn/dotCMSPlugins/CustomLogin/trunk

期望的输出
CustomLogin

【问题讨论】:

  • 您确定要删除尾随空格吗,就像您的delims=<space> 一样
  • jeb 的回答解决了主要问题。但是在分配变量时要小心多余的空格。你可能想要set pp=%%p。您的代码 set pp = %%p 有多余的空格,因此变量名包含一个尾随空格,而值包含一个前导空格。
  • @dbenham:嗯,这和我说的不一样吗? :-)
  • @jeb:哎呀,你确实做到了。我第一次阅读您的答案时不知何故错过了那句话。

标签: command-line batch-file for-loop


【解决方案1】:

设置有效,但扩展按预期以其他方式工作。

百分比扩展将在解析括号块的那一刻完成,而不是在单个命令执行的那一刻。 How does cmd.exe parse scripts

顺便说一句。在 set 语句中使用空格不是一个好主意,因为它会创建一个带有空格的变量,在您的情况下,set pp = %%p 创建一个名为pp<space> 的变量,其值为<space><content of %%p

您可以通过使用延迟扩展来获得所需的结果。

setlocal EnableDelayedExpansion
for /f "tokens=* delims= " %%p in (plugins.txt) do (
  set "myVar=%%p"
  set "myVar=!myVar:subversion/svn/dotCMSPlugins/=!"
  set "myVar=!myVar:/trunk=!"
  echo !myVar!
)

【讨论】:

  • 啊好的,我明白了,但是我现在怎么能用 !var! ?这是我想做的,但不起作用.. set !myVar!=!myVar:subversion/svn/dotCMSPlugins/=!
  • 我在我的示例中添加了它。在 set 语句中仅使用 myVar 作为变量名,而不是 !myVar!。 set 的语法是SET <variable name>=<content>SET "<variable name>=<content>",第二种形式确保不会在末尾添加不需要的空格。
  • 仍然不能 100% 工作,但我们正在接近! :) 我想要的是以下句子拆分字符串,以便我得到最终答案:CustomLogin subversion/svn/dotCMSPlugins/CustomLogin/trunk/ subversion/svn/dotCMSPlugins/= /trunk/=
  • 您应该编辑您的问题:向我们展示您从 plugins.txt 中获得了哪些行,以及您期望的输出应该是什么
  • 对不起,我想当我有变量时我可以自己做,但现在它不适合我!这是我在字符串中输入的字符串:subversion/svn/Plugins/CustomLogin/trunk 这就是我想要的输出:CustomLogin
【解决方案2】:

如果您的输入文件包含这一行:

subversion/svn/dotCMSPlugins/CustomLogin/trunk

你想得到这个结果:

CustomLogin

那么最简单的方法是用 / 字符分隔标记中的行并以这种方式获取第 4 个标记:

setlocal EnableDelayedExpansion
for /F "tokens=4 delims=/" %%p in (plugins.txt) do (
  set "myVar=%%p"
  echo !myVar!
)

如果 FOR 的目的只是为了得到这个结果,那么延迟扩展就没有必要了:

for /F "tokens=4 delims=/" %%p in (plugins.txt) do (
  set "myVar=%%p"
)
echo %myVar%

【讨论】:

  • 这是我想要使用的一种非常好的方式。只有一个问题。我需要完整的 URL 和“第五个令牌”。所以我认为这是最好的方法: for /f "tokens=* delims= " %%p in (plugins.txt) do (set "Var=%%p" for /F "tokens=5 delims=/" % %c in (%%p) do (set "myVar=%%c") DO SOME ACTIONS ) 但是他在第二个中找不到第五个token。
  • @Gynnad:%%p 必须用引号引起来。另外,我建议您使用 "delims=" 而不是 "tokens=* delims= " 来获取整行:for /F "delims=" %%p in (plugins.txt) do (set "Var=%%p" for /F "tokens=5 delims=/" %%c in ("%%p") do (set "myVar=%%c") DO SOME ACTIONS)
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多