gpt4 book ai didi

powershell - 如何在PowerShell中捕获icacls.exe的所有输出

转载 作者:行者123 更新时间:2023-12-03 08:12:00 37 4
gpt4 key购买 nike

我们有一个脚本,该脚本每周运行一次,并调整特定文件共享上的所有权限。我主要为此使用PowerShell脚本,但在某些部分还执行icacls.exe。由于文件很多,运行icacls.exe时会发生错误。

在脚本开始时,我重设了每个客户文件夹及其子项上的所有权限。其中一部分包括重置对象所有者。

我这样叫icacls.exe。

$ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q | Out-String

然后,我检查字符串 $ICACLSResult中的特定文本,以检查是否发生错误,并将字符串本身附加到我的错误消息中。
if($ICACLSResult -notmatch "bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten" -and $ICACLSResult -notmatch "Failed processing 0 files")
{
Add-Error -SED ($ErrorMSG + $ICACLSResult) -Level 2 -AddErrorInfo $False -ExitScript $False

Throw("AnErrorOccured")
}

但是,变量 $ICACLSResult的实际内容如下所示。
Successfully processed 13970 files; Failed processing 5 files

但是,当我直接在控制台中运行同一命令时,它看起来像这样。
PS C:\Users\User> $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q | Out-String

D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified.

PS C:\Users\User>

但是 $ICACLSResult再次看起来像这样。
PS C:\Users\User> $ICACLSResult
Successfully processed 13970 files; Failed processing 5 files

PS C:\Users\User>

如果没有这些详细的错误消息,则记录变量 $ICACLSResult毫无用处,因为它只说明了有多少个文件失败了,而不是具体列出了哪些文件。

如何获得此附加信息并将其存储在 $ICACLSResult中?我想要的只是失败文件的路径。

我到目前为止也尝试过的
  • $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 2>&1
  • $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 2>&1 | Out-String -Stream -Width 9999
  • $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q

  • 为什么他们不起作用
  • 太多信息,包含换行符
  • 太多信息,包含换行符
  • 所需信息仍然不在变量$ICACLSResult
  • 最佳答案

    在输出中保留错误的最简单方法是使用cmd Windows命令行实用程序将STDERR重定向到STDOUT。在重定向运算符周围使用引号将其传递给cmd:

    $log = cmd /c "2>&1" someutilityname /some /parameters

    例如:
    $log = cmd /c "2>&1" icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q

    现在,$ log变量是输出字符串的数组。

    关于powershell - 如何在PowerShell中捕获icacls.exe的所有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39346116/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com