【问题标题】:PowerShell script that's supposed to work for current user only works for specific user应该适用于当前用户的 PowerShell 脚本仅适用于特定用户
【发布时间】:2014-12-18 06:05:17
【问题描述】:

好的,下面的脚本出现了一个奇怪的错误:

$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 有问题,但我不确定。任何帮助将不胜感激!

【问题讨论】:

  • 当你说它对其他用户“不起作用”时——这是什么意思?它会抛出错误吗?
  • $env:Username 始终是指创建了 powershell 会话的用户,而不是当前登录的用户。因此,如果用户使用另一个凭据启动脚本,它将失败。这可能是问题吗?
  • 不工作是指它不会使用我指定的信息创建 2 个 csv 文件。 Paul,您能否再解释一下,“$env:Username 始终指的是创建了 powershell 会话的用户”?我曾认为,每当有人登录并运行脚本时,他们都会使用当前用户名创建一个 powershell 会话。如果不是这种情况,并且如果我创建了会话并将脚本发送给其他人,而我仍然是会话的创建者,我如何捕获当前登录的任何用户名?非常感谢您的回答以及您可以为我提供的任何帮助。
  • 脚本是否为其他用户运行?他们甚至可以访问吗?
  • 你能看到脚本抛出的异常吗?例如,如果您通过cmd 使用PowerShell.exe 执行此操作,您可以使用1> %USERPROFILE%\script-output.txt 2>&1 将所有输出重定向到“C:\Users\USERNAME\script-output.txt”。您可以使用现有的 try { } finally { } 块通过自己的脚本获得类似的结果。

标签: powershell csv scripting scripting-language


【解决方案1】:

注意:这是我的一个猜测,但是我最近遇到了类似的问题,发现以下对我有用。 p>

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

纯粹的 Powershell 方式

Join-Path $env:USERPROFILE "Documents"

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

.NET Framework 环境方式

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

这有点拗口,但实际上您是在利用 .NET 框架的能力来询问系统环境并询问用户 MyDocuments 文件夹在哪里。

【讨论】:

  • 这是我在尝试使用您列出的第一种方法来动态访问我的文档文件夹时得到的: Get-ChildItem Join-Path $env:USERPROFILE "Documents" Get-ChildItem :位置参数不能发现接受参数“文档”。第二种方法:Get-ChildItem [Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments) Get-ChildItem : 找不到名为“[Environment]”的提供程序。我只是做错了吗?
  • 尝试按如下方式分配文档目录的值:$documentFolder = Join-Path $env:USERPROFILE "Documents"; Get-ChildItem $documentFolder; 或者:$documentFolder = [Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments); Get-ChildItem $documentFolder;
  • 非常感谢理查德第一种方法有效。出于教育目的,您能否解释一下原因?非常感谢。
  • 当然,您希望我具体解释什么?为什么分成两行有效?或者为什么使用 $env:USERPROFILE 有效?
  • 好的,看来您的第一种方法有效,但我对更多用户进行了测试,但脚本运行时,用户名似乎并没有被正确地保存为动态值。我认为它以某种方式变成静态。我对加入路径的工作方式很感兴趣。
猜你喜欢
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2016-12-09
  • 1970-01-01
  • 2019-07-27
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多