设置内容,然后获取内容以某种方式更改内容

时间:2019-04-29 10:53:41

标签: powershell

PowerShell更改Get-Content上的文本文件或Set-Content上的变量的内容。

这是一个PowerShell脚本,用于编译一堆文件并将其格式化为单个文本文件,该部分检查新文件是否等于旧文件,但是根据比较,它永远不会。我试过弄乱诸如使新的var成为get-content那样的字符串数组之类的东西。

$files = Get-ChildItem -path "./dir" | Where-Object -FilterScript {$_.Name -match '[A-J]'}

$var = @()
foreach ($file in $files){
    $filePath = "dir\" + $file;
    $fileContent = Get-Content $filepath
    $var += $fileContent
}
$firstLine = '"this" "issen" "da" "first"'
$var1 = '"abc" "def" "12" "6"'
$var2 = '"456" "def" "12" "4"'
$newContent = $firstLine,$var,$var1,$var2
$oldContent = Get-Content './File.txt'

if (-not (Compare-Object $oldContent $newContent)) {
    Write-Host Nothing new.
} else {
    Write-Host Something new
    Set-Content './File.txt' -value $newContent
}
Set-Content './File.txt' -value $newContent
pause

$newContent$oldContent(只是从文本文件存储和检索的$newContent)进行比较时,它们并不相同。他们应该是吧?

从./dir收集的文本文件如下所示: a00.txt

a12 bc23 abc

b00.txt

a12 bc23 abg

1 个答案:

答案 0 :(得分:4)

您的第一行$var = "stuff","and","thangs"创建一个数组(3个字符串):

enter image description here

-eq运算符的工作方式不同于比较对象数组的工作。您可以改用 Compare-Object cmdlet:

if (-not (Compare-Object $var $var2)) {
 Write-Host True
} 

回答您的修改

您的第一个变量($newContent)是一个字符串数组,但还包括另一个字符串数组。看到这里:

PS D:\temp> $newContent -join ''
"this" "issen" "da" "first"System.Object[]"abc" "def" "12" "6""456" "def" "12" "4"

PS D:\temp> $oldContent -join ''
"this" "issen" "da" "first"a12 bc23 abca12 bc23 abg"abc" "def" "12" "6""456" "def" "12" "4"

一种 解决方法 是将变量通过管道传递到Out-String cmdlet,但是您可能会找到一种更干净的方法来解决它;-)

Compare-Object ($oldContent | out-string) ($newContent | out-string)