【问题标题】:Powershell global variables permissions issue - rewrite help neededPowershell全局变量权限问题 - 需要重写帮助
【发布时间】:2020-05-19 07:46:25
【问题描述】:

我正在尝试编写一个脚本来收集有关文件夹中文件的信息并输出到 csv。在我修改最终用户(标准用户、读取+执行、windows)的权限之前,一切正常。脚本无法捕获全局变量,虽然作为脚本变量工作,但输出是错误的。 (脚本被截断了一些)

$global:filecount = 1
Get-ChildItem C:\temp\data\ -Recurse -include @("*.txt*","*.pdf") |
Select-Object CreationTime,
@{Name = "Date Added";Expression={get-date}},
@{Name = "User Added";E={$env:UserName}},
@{n ='SHA1';e={(Get-FileHash $_ -Algorithm SHA1).Hash}}
@{n ='SHA256';e={(Get-FileHash $_ -Algorithm SHA256).Hash}}
@{n = "Filecount"; Expression = {$global:filecount; $global:filecount++}} |
Export-Csv $output_location -append

如果是全局的,非管理账户下filecount的输出为0。 如果脚本级别变量,并且实际文件数为 1,则输出为 1 1 1

我该如何解决这个问题?我是 powershell 新手,而不是行业的脚本制作者,所以我可能在这里遗漏了一些逻辑。

此外,脚本大约有 800 行长。每个其他变量都有效。大多数脚本是用户输入导出到 csv 的变量值。只有文件计数失败。

谢谢大家。

编辑澄清 输出创建一个 csv 文件,使得字段格式如下: enter image description here

CreationTime 添加到数据库的日期 英特尔添加到数据库的用户 Source sourceID FileID BaseName Extension Folder Kilobytes SHA1 SHA256 SHA512 MD5

【问题讨论】:

  • 您应该声明 $Global:filecount = 1 而不是 $filecount = 1,因为您稍后会增加全局 $global:filecount++ 范围。
  • 谢谢。我确实将变量声明为 $global: 和 $script: 到处匹配我上面脚本中的使用。如果我不这样做,我会收到另一个错误,指出 x 变量已经定义良好......

标签: powershell variables scripting


【解决方案1】:

只是让它更详细(和可读),这样你就不需要全局变量:

$fileCount = 0
$files     = Get-ChildItem -Path "C:\temp\data" -Recurse -Include @("*.txt*","*.pdf")
$fileInfo  = foreach ($file in $files) {
    $fileCount++
    [PSCustomObject]@{
        "CreationTime" = $file.CreationTime
        "Date Added"   = Get-Date
        "User Added"   = $env:UserName
        "Filecount"    = $fileCount
    }
}
Export-Csv -InputObject $fileInfo -Path $output_location -Append

【讨论】:

  • 谢谢你。上面的脚本而不是填充 csv 文件,我有以下输出: Count Length LongLength Rank SyncRoot IsReadOnly IsFixedSize IsSynchronized 367 367 367 1 System.Object[] FALSE TRUE FALSE 我也不能格式化回复吗?
  • mhu,我无法在您编写脚本时输出脚本,但是将 $fileinfo 管道传输到 export-csv 有效。但是,这种新格式似乎不允许我在右侧使用完整的表达式 IE "hashvalue" = {​​(Get-FileHash $_ -Algorithm MD5).Hash}} 这是需要的。我的工作 CSV 文件有 200k 个条目,我需要格式保持不变。
  • 不要加括号,使用$file: "hashvalue" = (Get-FileHash $file.FullName -Algorithm MD5).Hash
  • mhu,正在测试。删除了 $file: 标头。然而奇怪的是,使用这种方法,我们的测试环境不允许使用 MD5 哈希,而我上面的代码确实可以工作。我不知道为什么。感谢您提出一种更简洁的编写方式。当我测试权限时会投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2023-04-06
  • 2021-02-11
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
相关资源
最近更新 更多