适用于当前用户的PowerShell脚本仅适用于特定用户

时间:2014-10-22 17:24:07

标签: powershell csv scripting scripting-language

好的,我在下面的脚本中遇到了一个奇怪的错误:

$ErrorActionPreference = "silentlycontinue"
Try {

If (Test-Path \\Deploy\MyDocSize\live_docs_info.csv -PathType Leaf) {
    $runscript = Get-ChildItem "C:\Users\$env:username\Documents" -Recurse | Measure-Object -    property length -sum | Select @{Label="FolderSize";Expression={"{0:N2}" -f ($_.Sum / 1MB)}}, @{Label="Username";Expression={$env:username}} |
    ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File -Append -Encoding ascii -FilePath \\Deploy\MyDocSize\live_docs_info.csv -ErrorAction SilentlyContinue
    }

Else {
    $runscript = Get-ChildItem "C:\Users\$env:username\Documents" -Recurse | Measure-Object -property length -sum | Select @{Label="FolderSize";Expression={"{0:N2}" -f ($_.Sum / 1MB)}}, @{Label="Username";Expression={$env:username}} |
    ConvertTo-Csv -NoTypeInformation | Select-Object | Out-File -Append -Encoding ascii -FilePath \\Deploy\MyDocSize\live_docs_info.csv
    }
}

Finally {

If (Test-Path \\Deploy\MyDocSize\docs_info.csv -PathType Leaf) {
    $runscript = Get-ChildItem "C:\Users\$env:username\Documents" -Recurse | Measure-Object -property length -sum | Select @{Label="FolderSize";Expression={"{0:N2}" -f ($_.Sum / 1MB)}}, @{Label="Username";Expression={$env:username}} |
    ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File -Append -Encoding ascii -FilePath \\Deploy\MyDocSize\docs_info.csv -ErrorAction SilentlyContinue
    }

Else {
    $runscript = Get-ChildItem "C:\Users\$env:username\Documents" -Recurse | Measure-Object -property length -sum | Select @{Label="FolderSize";Expression={"{0:N2}" -f ($_.Sum / 1MB)}}, @{Label="Username";Expression={$env:username}} |
    ConvertTo-Csv -NoTypeInformation | Select-Object | Out-File -Append -Encoding ascii -FilePath \\Deploy\MyDocSize\docs_info.csv
    }
}

此脚本获取该用户的“我的文档”文件夹的当前用户名和大小,并将其导出到csv文件。我已经导出了两个不同的csv文件,如果在脚本运行时打开一个,它将继续运行并写入第二个。如果两者都是开放的,它将不会做任何事情。

基本上这个脚本适合我,但是当任何其他用户尝试运行它时,它将无效。我怀疑$ env:用户名有问题,但我不确定。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

注意: 这对我来说有点猜测,不过我最近碰到了类似的问题,发现以下内容对我有用

用户$env:username与其My Documents文件夹之间不一定存在一对一的映射。例如,如果从C:\Users\$env:username加载配置文件存在永久性问题,那么Windows将分配略微不同的名称,例如username_000。同样,某些版本的Windows最终使用短名称创建用户配置文件,例如userna~1,而不是长名。无论原因如何,有两个简单的解决方案:

Pure Powershell Way

Join-Path $env:USERPROFILE "Documents"

就是这么简单,但这不是防弹,因为可以将文档移动或重命名为其他可能导致错误或奇怪结果添加到CSV文件的内容。它可以在90-95%的情况下起作用。

.NET Framework环境方式

[Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments)

它有点拗口,但基本上你利用.NET框架能力来查询系统环境并询问用户MyDocuments文件夹的位置。