0

我们有一个每周运行一次并调整特定文件共享的所有权限的脚本。我主要为此使用 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?我想要的只是失败文件的路径。

到目前为止我也尝试过的

  1. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 2>&1
  2. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 2>&1 | Out-String -Stream -Width 9999
  3. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q

为什么他们不工作

  1. 信息过多,包含换行符
  2. 信息过多,包含换行符
  3. 所需信息仍然不可变$ICACLSResult
4

2 回答 2

2

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

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

例如:

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

现在 $log 变量是一个输出字符串数组。

于 2016-09-06T11:51:45.967 回答
0

也许作为另一种方式,您可以获得相同的 Get-Acl Set-Acl

于 2016-09-07T03:05:08.250 回答