PSCP 无法从 FOR 循环中的 ip 数组中检索但在 FOREACH 中有效?

PSCP cant retrieve from an array of ip in FOR loop but works in FOREACH?

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

基本上,我得到了不止一个远程源...如果我 运行 我的数组在 for 循环中出错,但是它对每个都有效,为什么?

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

整体代码(不工作,得到更多 thqn 一个远程源不受支持的错误)

$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 循环中 运行 不同的变量吗?或者,如果有人可以指导我使用对象命令...我已经阅读了有关它的论坛,但仍然不确定如何使用它

有两件事阻止您的第一个示例工作:

首先,您当前的 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])"
}

你可以试试这个, 使用不会与文件名冲突的字符串值连接目标路径和 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]
}

第一次使用 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
}