Скрипт PowerShell, который должен работать для текущего пользователя, работает только для конкретного пользователя

Итак, у меня странная ошибка со следующим скриптом:

$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: username виноват, но я не уверен. Любая помощь будет принята с благодарностью!

1 ответ

ПРИМЕЧАНИЕ: это немного догадка с моей стороны, однако я недавно столкнулся с подобной проблемой и обнаружил, что следующее работает для меня.

Не обязательно однозначное сопоставление между пользователями $env:username и их My Documents папка. Например, если существует постоянная проблема с загрузкой профиля из C:\Users\$env:username тогда окна будут назначать немного другое имя, например username_000, В равной степени определенные версии окон заканчивали тем, что создавали профили пользователей, используя короткое имя, например userna~1, а не длинное имя. Независимо от причины есть два простых решения:

Чистый способ Powershell

Join-Path $env:USERPROFILE "Documents"

Это так просто, это, однако, не является пуленепробиваемым доказательством, поскольку можно перемещать или переименовывать Документы во что-то еще, что приведет к ошибкам или странным результатам, добавляемым в файл CSV. Это будет работать в 90-95% случаев.

Путь среды.NET Framework

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

Это немного больше, но по сути вы используете возможности.NET Framework для опроса системной среды и выяснения, где пользователи MyDocuments папка есть.

Другие вопросы по тегам