初学者Powershell脚本错误

时间:2017-12-10 02:59:47

标签: powershell

要将3个IP地址逗号分隔值的文本文件加载到数组中,然后在ip地址的每个第3个八位字节中更改数组中的内容,然后将其导出回csv或文本文件。

foobar = session.query(FoobarModel).get(foobar_id)

props = {'name': 'my new name'}

for key, value in props.items():
    setattr(foobar, key, value)

session.commit()
session.flush()

成功将数据导出到csv文件。 而是一个空的csv文件。

##load file to an array
    $ipFileName="C:\Users\HarmanGrewal\Google Drive\win213\assignment2\IP.txt"
    $array1=@()
    $array1=Get-Content $ipFileName -Delimiter ","
#now we have the contents in an array
    $count=0
foreach($i in $array1){
                       $array1[$count] = $array1[$count] -replace "\.\d{1}\.",".2."
                       $count++
                      }
Get-Content $array1 | export-csv -path "C:\Users\HarmanGrewal\test.txt"

2 个答案:

答案 0 :(得分:1)

首先,如果你在这里使用foreach,则不需要$count变量。第二件事就在你的最后一行,你将集合$array1传递给Get-Content。它将路径作为参数。所以它试图将文件的内容存储在$array1,这是不正确的。 请修改如下代码。

$ipFileName="C:\Users\HarmanGrewal\Google Drive\win213\assignment2\IP.txt"
$array1=@()
$array1=Get-Content $ipFileName -Delimiter ","
#now we have the contents in an array
foreach($i in $array1){
    $i = $i -replace "\.\d{1}\.",".2."
    $i
}
$array1 | export-csv -path C:\Users\HarmanGrewal\test.txt 

答案 1 :(得分:1)

# Read the 3 IP addresses from the input file into an array.
# .TrimEnd() ensures that a trailing newline, if any, is stripped (syntax requires PSv3+)
$ips = (Get-Content $ipFileName -Delimiter ",").TrimEnd()

# Replace single-digit IP octets with fixed value 2,
# join the resulting IPs with ',' again, and write to an output file.
$ips -replace '\.\d{1}\.', '.2.' -join ',' | Set-Content "C:\Users\HarmanGrewal\test.txt"

至于您尝试的内容

$array1=@()
$array1 = ...

$array1=@()没有意义,因为下一行再次分配给$array1 ,这意味着 RHS确定了{{的数据类型1}},与之前的$array1任务无关; 如果=@()命令恰好返回单个值,Get-Content将是标量;您可以通过将$array1命令放在Get-Content数组子表达式运算符中,但在PSv3 +中通常不需要,因为它统一处理了标量和集合。

@(...)枚举数组元素本身,其中foreach($i in $array1)是每个数组元素的按值副本。
而不是使用单独的$i变量通过索引通过引用访问元素以便更新它们,而PowerShell允许您简单地重新创建整个数组:

$count

或者更简洁地说,依赖于$array1 = foreach ($el in $array1) { $el -replace "\.\d{1}\.",".2." } 运算符对数组值LHS值的支持:

-replace

Harsh Jaswal's answer指出时,$array1 = $array1 -replace "\.\d{1}\.",".2." 错误地传递了目标文件内容,而Get-Content $array1期望 filename 参数读取内容来自。

由于输出的值 - 在数组Get-Content中 - 已经在内存中,您只需通过管道直接发送它们

$array1对对象的属性进行操作,因为您提供的字符串对象只有Export-Csv属性,所有将被导出的是该属性,这不是意图。

在目前的情况下,您必须使用.Length基于在内存中构建CSV格式的字符串,直接编写文本文件。 请注意,Set-Content使用系统的遗产" ANSI"代码页默认;使用Set-Content来改变它。