重温:在 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 不会退出

使用 cmd.exe 或 PowerShell 或 Python 从 Windows 命名管道中读取

powershell 使PowerShell脚本可以从任何地方运行(即CMD.EXE,Explorer,Run Dialog等)

CMD.exe替换[关闭]

Powershell -Window下比cmd.exe更具可读性易用性可面向对象的命令行客户端

如何调试混合 cmd 和 powershell 脚本以解决特殊字符问题,如 & 和