PowerShell脚本用于对2列csv文件中的数据执行2个不同的命令

niwlg2el  于 2023-04-30  发布在  Shell
关注(0)|答案(1)|浏览(138)

使用PowerShell,我尝试从CSV文件中获取信息,并执行基于两列数据的两个命令。第一条数据是一个资产,它需要将一个唯一的文件复制到一个文件夹,并重命名为config。txt文件。
第二段数据是计算机的名称,该计算机将接收到唯一文件的文件夹复制到指定的计算机。比如说;
第一个命令:

Copy-Item "c:\folder1\$asset.txt" -Destination "f:\folder2\config.txt"

第二命令:

robocopy /e folder2 \\$ComputerName\folder3

数据是从一个csv文件导入的,该文件有两列assetcomputername。脚本如下,是许多变体之一,其中没有一个工作,包括下面的一个。任何帮助将不胜感激。
Computers.csv包含以下内容

A12345  CN12345
A54321  CN54321

脚本:

Import-Csv -Delimiter ',' -Path c:\temp\computers.csv -Header 'Asset','ComputerName’ | 
   ForEach-Object {
     $asset += $_.asset
     $ComputerName += $_.NBN
     Copy-Item "c:\folder1\$asset.txt" -Destination "f:\folder2\config.txt"
     robocopy /e  f:\folder2 \\$ComputerName\folder3 
   }

我写了剧本,结果如下。该脚本做我想做的事情,除了我必须手动更改数组中项的位置。我想自动完成这一点,但还没有弄清楚这一部分。我希望csv文件包含50个或更多的资产和计算机名,并不期望输入每个项目的位置并运行脚本50次。有没有办法自动穿越阵列?
$computers = Import-Csv -Path c:\temp\computers。csv -标头“Asset ','ComputerName' $asset = $computers[0]。asset $ComputerName = $computers[0]。计算机名称
ForEach-Object {

Copy-Item "c:\folder1\$asset.txt" -Destination "f:\folder2\config.txt"
 
  robocopy /e /is "f:\folder2\" "\\$ComputerName\c$\folder3"  
  }
bkkx9g8r

bkkx9g8r1#

首先,确保你的csv没有包含头文件。如果是这样,并且您使用了-header标志,则会向内容中添加重复的头。
我使用csv测试了这个解决方案,没有header,内容如下:

abc,123,
def,456,
ghi,789

每当我调试涉及在循环中访问值的代码时,我喜欢编写一些代码来将这些值写入控制台,如下所示:

$assetIndex = 0
Import-Csv -Header Asset,ComputerName -Path C:\noHeader.csv | 
ForEach-Object {
    Write-Host ([string]::Concat('Asset at index ',$assetIndex, ': The asset value is "', $_.Asset, '", The computer name is "', $_.ComputerName,'"'))
    $assetIndex++
}

运行它将证明我们正确地访问了循环中的值。最后,当使用$_访问值时,循环中的字符串连接可能会有点混乱。
下面是两个例子,说明如何在循环中构建copy-item文件路径:

#example 1
"c:\folder1\$($_.asset).txt"
#example 2
[string]::Concat('c:\folder1\',$_.Asset, '.txt')

把所有这些放在一起,我们得到:

Import-Csv -Header Asset,ComputerName -Path C:\noHeader.csv | 
ForEach-Object {
  Copy-Item "c:\folder1\$($_.asset).txt" -Destination "f:\folder2\config.txt"
  robocopy /e /is "f:\folder2\" "\\$($_.ComputerName)\c$\folder3" 
}

当将变量放在引号内时,如果你想访问该变量的属性,那么你需要使用$($myVariable.someProperty)语法,否则.someProperty将被解释为字符串。

相关问题