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

Powershell 设置内容,然后获取内容以某种方式更改内容,powershell,Powershell,PowerShell在获取内容时更改文本文件的内容,或在设置内容时更改变量 这是一个PowerShell脚本,用于编译一组文件并将其格式化为单个文本文件,此部分检查新文件是否与旧文件相等,但根据比较,它永远不会相等。我尝试过处理一些事情,比如像get content那样将新的var设置为字符串数组 $files=Get-ChildItem-path./dir | Where-Object-FilterScript{$\u.Name-match'[A-J]} $var=@ foreach$文件在$

PowerShell在获取内容时更改文本文件的内容,或在设置内容时更改变量

这是一个PowerShell脚本,用于编译一组文件并将其格式化为单个文本文件,此部分检查新文件是否与旧文件相等,但根据比较,它永远不会相等。我尝试过处理一些事情,比如像get content那样将新的var设置为字符串数组

$files=Get-ChildItem-path./dir | Where-Object-FilterScript{$\u.Name-match'[A-J]} $var=@ foreach$文件在$文件中{ $filePath=dir\+$file; $fileContent=获取内容$filepath $var+=$fileContent } $firstLine='这是第一个' $var1='abc def 12 6' $var2='456 def 12 4' $newContent=$firstLine,$var,$var1,$var2 $oldContent=Get Content'./File.txt' 如果-不比较对象$oldContent$newContent{ 写主机没有什么新的。 }否则{ 写些新东西 设置内容“./File.txt”-值$newContent } 设置内容“./File.txt”-值$newContent 暂停 将$newContent与$oldContent进行比较时,它们只是从文本文件中存储和检索的$newContent,但并不相同。应该是吧

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

b00.txt

a12 bc23 abg
您的第一行$var=stuff,并且,thangs创建了一个数组3个字符串:

对于比较对象数组,-eq操作符的工作方式与此不同。您可以改为使用cmdlet:

回答您的编辑问题:

第一个变量$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)
您的第一行$var=stuff,并且,thangs创建了一个数组3个字符串:

对于比较对象数组,-eq操作符的工作方式与此不同。您可以改为使用cmdlet:

回答您的编辑问题:

第一个变量$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)

您不应该使用-eq来比较数组。尝试使用比较对象。有关比较数组的更多信息,请查看您不应该使用-eq来比较数组。尝试使用比较对象。有关比较数组的更多信息,请看一看以进行更详细的阐述,此行为的原因是-eq运算符比较两个数组对象的标识,并且仅当两个变量都包含对完全相同对象的引用时才会返回true,然而,即使两个对象包含相同的元素,对不同对象的引用也会返回false。感谢Ansgar,这解释了为什么它不返回true。这对示例有效,但不是我的实际脚本和数据集。我不知道为什么。实际数据集位于多行上,这会影响它吗?我是通过$files{$var+=$fileContent}@Jokru中的foreach$file获得它的。是的,这是一个不同之处,因为使用$var+=可以生成一个字符串,而get-Content cmdlet会返回一个字符串数组,如果您不使用-raw开关来详细说明,此行为的原因是,-eq运算符比较两个数组对象的标识,并且仅当两个变量都包含对完全相同对象的引用时才会返回true,而即使两个对象都包含相同的元素,对不同对象的引用也会返回false。感谢Ansgar,这就解释了为什么它不返回true。这对示例有效,但不是我的实际脚本和数据集。我不知道为什么。实际数据集位于多行上,这会影响它吗?我使用$files{$var+=$fileContent}@Jokru Yes中的foreach$file获得它,这是一个不同之处,因为使用$var+=可以生成一个字符串,而如果不使用-raw开关,get-Content cmdlet将返回一个字符串数组