【问题标题】:PSCP cant retrieve from an array of ip in FOR loop but works in FOREACH?PSCP 无法从 FOR 循环中的 ip 数组中检索但在 FOREACH 中有效?
【发布时间】:2020-06-16 02:44:25
【问题描述】:

我有一个 powershell 脚本,所以基本上我需要将文件从多个源传输到一个本地。在这种情况下,我不想使用 pslurp。

基本上,如果我在 for 循环中运行我的数组,我会得到多个远程源...错误,但是它适用于每个为什么?

现在的问题是我无法更改我的目标路径,因为我不知道在哪里让我的目标数组在 foreach 循环中运行。如果我指定一个源 ip,它可以循环发送到不同的目标。所以我的数组和循环在技术上工作正常。

整体代码(不工作,得到更多 thqn one remote source not supported 错误)

$ArrayIP=@("root@10.0.0.1","root@10.0.0.2")
$ArrayDestination=@("C:/Users/me/save01","C:/Users/me/save01"}

for (i=0; i -le2; i++){
pscp -pw testing -r $ArrayIP[i]":"/cf/conf/backup/* $ArrayDestination[i]
}

所以我改成了 FOREACH... 但现在我不知道如何让它保存到不同的目的地? 无论哪种方式,我都指定了一个目的地以进行测试,它可以工作。我不再收到不止一个远程源错误。

foreach ($IP in $ArrayIP){
pscp -pw testing -r $IP":"/cf/conf/backup/* <insert destination? dk how to make it run an arrayDestination>
}

现在我在想我是否应该做一个二维数组...这会帮助我在 foreach 循环中运行不同的变量吗?或者如果有人可以指导我使用 object 命令...我已经阅读了有关它的论坛,但仍然不确定如何使用它

【问题讨论】:

  • 第 2 行末尾有语法错误。第 4 行有语法错误,第 5 行。
  • 对不起,这不是我的实际代码,并且在重新输入整体 coe 时没有注意!谢谢指出!
  • 我已回滚您的编辑。在标题中添加 SOLVED 或为问题添加解决方案是不合适的。您已表明您的问题已通过接受答案得到解决。您可以在help center 中找到有关该网站如何运作的更多信息。

标签: arrays powershell for-loop foreach pscp


【解决方案1】:

有两件事会阻止您的第一个样本工作:

首先,您当前的 for 循环无效 - PowerShell 中的变量名称以 $ 为前缀:

for ($i=0; $i -le 2; $i++){
   ...
}

其次,PowerShell 将命令行参数视为可扩展字符串,数组索引操作不会在字符串中正确扩展 - 将其括在子表达式 $() 中以正确扩展引用的数组索引:

for ($i=0; $i -le 2; $i++){
    pscp -pw testing -r "$($ArrayIP[$i]):/cf/conf/backup/*" "$($ArrayDestination[$i])"
}

【讨论】:

  • tq!!!这行得通!然而,由于这是一个测试,我们实际上需要将大量服务器提取到本地......所以让它更有条理?我应该采用哪种方法?由于我将使用大量数组(用于 ip、dest、pw、用户名等),因此很难跟踪,我需要确保此 arrayDest[1] 必须用于 arrayIP[1] 和 arrayUser[1] 如果你明白我的意思......因为如果信息不一致......我们会毁了一切
  • @Anonymous01 我会使用哈希表:@{'root@10.0.0.1'="C:/Users/me/save01"} 然后遍历它
【解决方案2】:

你可以试试这个, 使用不会与文件名冲突的字符串值加入目标路径和 IP,并在循环内按该值分割。

$Array=@("root@10.0.0.1--C:/Users/me/save01","root@10.0.0.2--C:/Users/me/save01")

foreach ($Entry in $ArrayIP){
    $Split = $Entry -split '--'
    pscp -pw testing -r ($Split[0] + ':/cf/conf/backup/*') $Split[1]
}

【讨论】:

    【解决方案3】:

    第一次使用 Powershell?这接近于第一个例子。使用@() 来制作数组是很多人迷信的神话。我喜欢使用单引号,除非里面有变量。

    $ArrayIP = 'root@10.0.0.1', 'root@10.0.0.2'
    $ArrayDestination = 'C:/Users/me/save01', 'C:/Users/me/save01'
    
    for ($i=0; $i -lt 2; $i++){
      pscp -pw testing -r ($ArrayIP[$i] + ':/cf/conf/backup/*') $ArrayDestination[$i]
    }
    

    我用这样的 pscp 测试了线路,以确保我得到了正确的字符串。使用其他方法,我最终得到了额外的空格。

    for ($i=0; $i -lt 2; $i++){
      cmd /c echo pscp -pw testing -r ($ArrayIP[$i] + ':/cf/conf/backup/*') $ArrayDestination[$i]
    }
    
    pscp -pw testing -r root@10.0.0.1:/cf/conf/backup/* C:/Users/me/save01
    pscp -pw testing -r root@10.0.0.2:/cf/conf/backup/* C:/Users/me/save01
    

    这里有一些更漂亮的哈希数组。或者你可以导入一个 csv。

    $hashes = @{source='root@10.0.0.1:/cf/conf/backup/*'; destination='C:/Users/me/save01'},
              @{source='root@10.0.0.2:/cf/conf/backup/*'; destination='C:/Users/me/save01'}
    
    foreach ($item in $hashes) {
      pscp -pw testing -r $item.source $item.destination
    }
    
    

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多