this question 的最受欢迎答案涉及以下 Windows powershell 代码(已编辑以修复错误):
$file1 = Get-Content C:\temp\file1.txt
$file2 = Get-Content C:\temp\file2.txt
$Diff = Compare-Object $File1 $File2
$LeftSide = ($Diff | Where-Object {$_.SideIndicator -eq '<='}).InputObject
$LeftSide | Set-Content C:\temp\file3.txt
我总是得到一个零字节文件作为输出,即使我删除了 $Diff 行也是如此。
为什么输出文件总是空的,如何解决?
最佳答案
PetSerAl ,正如他通常所做的那样,在对问题的评论中提供了关键指针:
Member-access enumeration - 能够访问集合 上的成员(属性或方法)并将其隐式应用于它的每个元素,结果收集在 em>数组,是introduced in PSv3 .[1]
成员访问枚举不仅表达方便,而且比其他方法更快。
一个简化的例子:
PS> ((Get-Item /), (Get-Item $HOME)).Mode
d--hs- # The value of (Get-Item /).Mode
d----- # The value of (Get-Item $HOME).Mode
正在申请 .Mode 集合 (...) -封闭的命令输出导致 .Mode要在集合中的每个项目 上访问的属性,结果值作为数组(常规 PowerShell 数组,类型为 [System.Object[]])返回。
注意事项:成员访问枚举像管道一样处理结果数组,这意味着:
如果数组只有一个单个元素,则该元素的属性值直接返回,而不是在单个元素数组中:
PS> @([pscustomobject] @{foo=1}).foo.GetType().Name
Int32 # 1 was returned as a scalar, not as a single-element array.
如果收集的属性值是它们自己数组,则返回一个平面值数组:
PS> @([pscustomobject] @{foo=1,2}, [pscustomobject] @{foo=3,4}).foo.Count
4 # a single, flat array was returned: 1, 2, 3, 4
此外,成员访问枚举仅适用于获取(读取)属性值,不适用于设置(写入)它们。
This asymmetry is by design , 以避免可能不需要的批量修改;在 PSv4+ 中,使用 .ForEach('<property-name', <new-value>) 作为最快的解决方法(见下文)。
这个方便的功能不可用,但是:
例如,即使在 PSv3+ 中,以下内容也不会执行成员访问枚举:
PS> ('abc', 'cdefg').Length # Try to report the string lengths
2 # !! The *array's* .Length property value (item count) is reported, not the items'
在这种情况下 - 通常在 PSv2 中 - 需要一种不同的方法:
foreach 语句,假设整个集合作为一个整体装入内存(这在使用成员访问枚举时隐含)。PS> foreach ($s in 'abc', 'cdefg') { $s.Length }
3
5
.ForEach() ,也对整个集合进行操作:PS> ('abc', 'cdefg').ForEach('Length')
3
5
注意:如果适用于输入集合,您还可以使用 .ForEach('<prop-name>', <new-value>)设置属性值,这是无法使用 .<prop-name> = <new-value> 的最快解决方法,即无法使用成员访问枚举设置属性值。
注意:如果您单独地一个接一个地处理项目,而不将结果也收集到内存中,那么使用管道才具有内存效率。
使用 ForEach-Object cmdlet,如 Burt Harris' helpful answer :
PS> 'abc', 'cdefg' | ForEach-Object { $_.Length }
3
5
仅针对属性(与方法相反),Select-Object -ExpandProperty是一个选项;它在概念上清晰简单,几乎与 ForEach-Object 相当性能方面的方法(有关性能比较,请参阅 this answer 的最后一节):
PS> 'abc', 'cdefg' | Select-Object -ExpandProperty Length
3
5
[1] 以前,该功能被半官方称为成员枚举,在this 2012 blog post 中引入。连同功能本身。正式引入术语成员访问枚举的决定是made in early 2022 .
关于windows - Powershell:始终生成空文件(比较对象的输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44607064/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信