我正在尝试使用powershell脚本将大量信息写入.csv文件。我从SCCM配置管理器中的"Run Script“功能在1500台计算机上运行此脚本。该脚本在所有机器上运行,但并非所有机器都在文件中写入了有关它们的信息。在1352台机器中,只有375台写入了文件。我怀疑程序要么运行得太快,无法在下一台机器运行脚本之前打开和关闭文件,也无法写入文件,因为它仍然是打开的。有什么办法可以解决这个问题吗?我看过关于使用StreamWriter的帖子,但不确定这是否能解决我的问题。
我试过将计算机分成更小的组,比如一次8个,但其中只有5个将信息写入文件。代码如下所示,可以正常工作。
#Overrides GPO execution policy
Set-ExecutionPolicy Bypass
#Gets and writes computer name to .csv file
$env:COMPUTERNAME = HostName
#Checks the path to see if a particular file is present
$DeplPath = "AppData\LocalLow\Sun\Java\Deployment\deployment.properties"
#Checks each user profile on machine for the deployment.properties file and writes to .csv "True" if present and "False" if it isn't
$javausers = foreach ($User in Get-ChildItem C:\Users -Directory){
$folder = Join-Path $User.FullName $DeplPath
if (Test-Path $folder) {
$TestResult = "True - deployment.properties"
} Else {
$TestResult = "False - Path not found"
}
[PSCustomObject]@{
"Computer Name" = $env:COMPUTERNAME
"Java User True/False" = $TestResult
"Users" = $user.Name
#"Last Write Time" = $file.LastWriteTime = (Get-Date)
}
}
#This is used for on-screen display only
#$javausers
#Tests path accessibility and writes an error file to the local machine if the path can't be found
try
{
$javausers | Export-Csv -NoTypeInformation -Path "\\anyserver\Java_User_Reports\testjava.csv" -Append
}
catch
{
$_| Out-File "c:\Temp\java_error.txt"
}我想让脚本搜索有关每个用户的信息写入1500台机器中的每台机器的文件中。
发布于 2019-09-09 22:22:25
我找到了一个更简单的解决方案,只需在文件名中添加一个Get-Date选项,这样就可以同时提取毫秒数,确保每次都会创建一个新文件,并且不会覆盖先前的文件。这在几分钟内创建了1365个文件。我将输出行更改为以下内容:
$dateTime | Export-Csv -NoTypeInformation -Path "\\anyserver\Java_User_Reports\$env:COMPUTERNAME-javausers-$(Get-Date -Format "yyyyMMddHHmmssff").csv" -Append然后,我将文件复制到我机器上的本地文件夹,打开命令提示符,输入命令以更改文件所在的目录路径。然后我输入命令来查看文件夹中的文件,并确保所有我想要的文件都在那里。最后,我键入copy *.csv newfilenamehere.csv,以便将所有信息放在一个文件中。结果正是我需要的,并解决了从多台计算机获取信息的问题,而无需脚本保持文件打开,也不允许向其中写入其他信息。

https://stackoverflow.com/questions/57808813
复制相似问题