我想要的输出文件出了点问题。
我收到“空路径”错误,
No se puede enlazar el argumento al parámetro 'Path' porque es nulo.
+ CategoryInfo : InvalidData: (:) [Add-Content], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.AddContentCommand
+ PSComputerName : localhost
如果我在脚本块中移动$ outputReport,有时会出现错误,指出文件“ x”正在由其他进程使用:
El proceso no puede obtener acceso al archivo 'C:\Users\mario\Desktop\Report700.csv' porque está siendo utilizado en otro proceso.
+ CategoryInfo : WriteError: (C:\Users\mario\Desktop\Report700.csv:String) [Add-Content], IOException
+ FullyQualifiedErrorId : GetContentWriterIOError,Microsoft.PowerShell.Commands.AddContentCommand
+ PSComputerName : localhost
我的来源是这样的CSV:
pc1,user1
pc2,user2
pc3,user3
代码:
$csvLocation = '~\desktop\test.csv'
$csv = import-csv $csvLocation -Header PCName, User
#Output File:
$outputReport = "~\Desktop\Report700.csv"
#desktop cuota:
# info:
# "209715200" Bytes = 200 MB
# "1048576" Bytes = 1 MB
$cuota = "209715200"
$cuotaTranslate = "$($cuota / 1MB) MB"
Write-Host "Cuota is set to $cuotaTranslate"
#ScriptBlock
$sb = {
Param($computer, $username)
if (!(Test-Connection -Quiet -count 2 -computer $computer)) { return }
$w7path = "\\$computer\c$\users\$username\desktop"
$desktopSize = (Get-ChildItem -Recurse -force $w7path | Measure-Object -ErrorAction "SilentlyContinue" -property length -sum)
if($($desktopSize.sum) -gt $cuota){
$newline = "{0},{1},{2}" -f $computer,$Username,"$("{0:N0}" -f $($desktopSize.sum / 1MB)) MB"
$newline | Add-Content $outputReport
}
}
$csv | % {
Start-Job -ScriptBlock $sb -ArgumentList $_.PCName, $_.User
}
# wait for completion
do {
Start-Sleep -Milliseconds 100
} while (Get-Job -State 'Running')
# cleanup
Get-Job | % {
Receive-Job -Id $_.Id
Remove-Job -Id $_.Id
}
Write-Host "All done!"
您在这里遇到范围问题。变量$outputReport
的脚本块内大于变量不同的变量$outputReport
在脚本范围。如果希望脚本块中的变量与外部变量具有相同的值,则需要通过-ArgumentList
参数将该值传递到脚本块中:
#ScriptBlock
$sb = {
Param($computer, $username, $outputReport)
...
}
$csv | % {
Start-Job -ScriptBlock $sb -ArgumentList $_.PCName, $_.User, $outputReport
}
但是,这样做会产生其他问题,例如多个并行作业对输出文件的并发访问。您可以通过| Add-Content $outputReport
从脚本块中删除并将所有输出从已完成的作业中收集到文件中时将所有输出写入文件来避免这种情况。
为此,请删除此内容:
if($($desktopSize.sum) -gt $cuota){
$newline = "{0},{1},{2}" -f $computer,$Username,"$("{0:N0}" -f $($desktopSize.sum / 1MB)) MB"
$newline | Add-Content $outputReport
}
并添加以下内容:
Get-Job | % {
Receive-Job -Id $_.Id
Remove-Job -Id $_.Id
} | Out-File $outputReport
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句