0

我有一个 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 命令...我已经阅读了有关它的论坛,但仍然不确定如何使用它

4

3 回答 3

0

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

于 2020-03-03T17:47:28.073 回答
0

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

首先,您当前的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])"
}
于 2020-03-03T17:04:35.337 回答
0

你可以试试这个,用一个不会与文件名冲突的字符串值加入目标路径和 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]
}
于 2020-03-03T17:06:19.167 回答