重温:在 cmd.exe 和 PowerShell 的 for 循环中迭代变量赋值
Posted
技术标签:
【中文标题】重温:在 cmd.exe 和 PowerShell 的 for 循环中迭代变量赋值【英文标题】:Revisited: Iterating variable assignment within for-loops in cmd.exe and PowerShell 【发布时间】:2021-09-21 12:07:30 【问题描述】:关于在 for 循环中迭代变量赋值的问题在 Stack Overflow 上有很长的历史。最突出的是bash中的解决方案:
#!/bin/bash
for i in 1..28
do
if [ $i -le 9 ]
then
cd /change/to/target/folder/and/numerated/sub/folder0$i
sh RunScript.sh data_0$i.file
else
cd /change/to/target/folder/and/numerated/sub/folder$i
sh RunScript.sh data_$i.file
fi
done
(else
前后的区别是$i
之前的0
)
在 Stack Overflow 上,python 和 R 也讨论了循环中迭代变量名称的这种内联 shell 扩展。
这里我想问一个问题,如何在.bat文件中进行这样的操作,一次用cmd.exe执行,也用Microsoft PowerShell执行,如果有区别的话。
到目前为止,我的代码如下所示:
FOR /L %i IN (1,28) DO (
pscp user@server.url.de:/path/to/target/folder/and/numerated/sub/folder%i/data_%i.file H:\path\to\target\folder\data%i.file
server_password
显然,此代码不起作用,但是 (a) 我想知道哪些代码可以起作用,以及 (b) cmd.exe 和 PowerShell 的代码之间是否存在差异。
编辑:
我现在确实有这个:
@ECHO OFF
FOR /L %%i IN (1,1,28) DO (
IF (%%i LEQ 9) (
pscp H:\path\to\iterated\directory\subfolder%%i\and\files\*.as user@server.url.de:/path/to/iterated/directory/subfolder0%%i/files/
serverpassword
) ELSE (
pscp H:\path\to\iterated\directory\subfolder%%i\and\files\*.as user@server.url.de:/path/to/iterated/directory/subfolder%%i/files/
serverpassword)
)
但我收到一条错误消息: ""("此时无法在语法上处理""。
【问题讨论】:
缺少)
。您是在批处理文件中执行此代码还是直接在命令行上执行此代码(您同时标记了两者)? Powershell非常不同。
...虽然,问题应该仅限于一个,因此在同一个问题中询问 PowerShell 示例和批处理文件示例是错误的。因此,我删除了您的 [powershell] 标签,只专注于您提供代码的问题。为此,我建议的第一件事是打开命令提示符窗口,输入for /?
,按[ENTER]
键,然后阅读命令的使用信息,特别注意@987654336 的语法@命令,FOR /L %variable IN (start,step,end) DO command [command-parameters]
,你的不匹配。
@PolII,只是为了稍微扩展一下 Stephans 的查询,虽然 [batch-file] 是通过 [cmd] 运行的,但有一些事情需要考虑。所以,关于我之前的建议,当你阅读命令的使用信息时,不要只跳到For /L
部分,因为这样做你会错过一些其他重要信息,关于代码之间的重要区别批处理文件或直接在cmd中。 To use the FOR command in a batch program, specify %%variable instead of %variable.
我可以说1..28 | % your command here using $_ as the incremented number
,但与许多事情一样,可能有不止一种方法,而另一种可能更合适,for ($i=1; $i -le 28; $i++) your command here using $i as the incremented number
。
没有。你可以用echo on
运行它,看看真正执行了什么,以及它到底在哪里停止。顺便说一句:您的if
行:您将字符串(9
与字符串9)
进行比较,这绝对不是您想要的。使用if %%i LEQ 9 (
【参考方案1】:
对于那些碰巧和我有同样问题的人,这里的答案是适用于 for-loop/if 结构的代码,其中增量变量作为批处理脚本:
@ECHO OFF
FOR /L %%i IN (1,1,28) DO ( ::The numbers refer to start, step and end
IF %%i LEQ 9 (
pscp H:\path\to\iterated\directory\subfolder%%i\and\files\*.as user@server.url.de:/path/to/iterated/directory/subfolder0%%i/files/
serverpassword
) ELSE (
pscp H:\path\to\iterated\directory\subfolder%%i\and\files\*.as user@server.url.de:/path/to/iterated/directory/subfolder%%i/files/
serverpassword)
)
【讨论】:
以上是关于重温:在 cmd.exe 和 PowerShell 的 for 循环中迭代变量赋值的主要内容,如果未能解决你的问题,请参考以下文章
使用 cmd.exe 或 PowerShell 或 Python 从 Windows 命名管道中读取
powershell 使PowerShell脚本可以从任何地方运行(即CMD.EXE,Explorer,Run Dialog等)