我对 PowerShell 脚本非常陌生。
我有两个文件夹,两个文件夹中有数百个同名文件。我正在编写一个长脚本来比较所有文件并将输出发送到文本文件。当我使用这个脚本时:
compare-object (get-content "D:\Folder1\file1.js") (get-content "D:\Folder2\file1.js")
compare-object (get-content "D:\Folder1\file2.js") (get-content "D:\Folder2\file2.js")
compare-object (get-content "D:\Folder1\file3.js") (get-content "D:\Folder2\file3.js")
我得到的是这个:
InputObject SideIndicator
----------- -------------
* New Text =>
* <=
这并没有告诉我哪个文件有这个区别。我希望它也显示文件名(任何人,第一个或第二个文件名)。
我怎样才能做到这一点?
我知道我应该使用 Get-Children,但我需要先学习简单的东西,它可以在循环中实现。
Get-Content
使用包含源文件完整路径的 .PSPath
属性(以及其他属性)装饰其输出行:
Compare-Object (Get-Content D:\Folder1\file1.js) (Get-Content D:\Folder2\file1.js) |
Select-Object InputObject,
SideIndicator,
@{ n = 'Path'; e = { $_.InputObject.PSPath } }
注意使用 calculated property 将
Path
属性添加到输出对象。
Select-Object
创建具有指定属性的 new 对象。Compare-Object ... -OutVariable results
保留原始输出对象 - 是使用 Format-Table
.
如果对于来自same文件的任何不同行块,您只想打印块中first行的路径,则需要更多工作,使用辅助。调用者范围内的变量:
$prevPath = ''
Compare-Object (Get-Content D:\Folder1\file1.js) (Get-Content D:\Folder2\file1.js) |
Select-Object InputObject,
SideIndicator,
@{
Name = 'Path'
Expression = {
if ($_.InputObject.PSPath -ne $prevPath) {
(([ref] $prevPath).Value = $_.InputObject.PSPath)
}
}
}
注:
Expression
脚本块在调用方的 child 范围内运行,因此直接分配给 $prevPath
将创建一个 local 变量,该变量在每次脚本块调用后超出范围。
([ref] $prevPath).Value
是一种方便的方式,尽管在 parent范围内引用
$prevPath
是一种方便的方式,即调用者的。(Get-Variable -Scope 1 prevPath).Value
将赋值包含在
(...)
中传递赋值through,即也outputs值。
注意:在这种情况下,最好使用
Format-Table
,因为输出修改仅用于显示目的.