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



我们有一个脚本,每周运行一次,并调整特定文件共享的所有权限。我主要使用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:UsersUser> $ICACLSResult = icacls "$OBJPath*" /setowner $OBJOwner /t /c /q | Out-String
D:Folder1Folder2Folder3File.txt: The system cannot find the path specified.
D:Folder1Folder2Folder3File.txt: The system cannot find the path specified.
D:Folder1Folder2Folder3File.txt: The system cannot find the path specified.
D:Folder1Folder2Folder3File.txt: The system cannot find the path specified.
D:Folder1Folder2Folder3File.txt: The system cannot find the path specified.
PS C:UsersUser>

但是$ICACLSResult又是这样的

PS C:UsersUser> $ICACLSResult
Successfully processed 13970 files; Failed processing 5 files
PS C:UsersUser>

没有这些详细的错误消息,记录变量$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. 中仍未包含所需信息

在输出中保留错误的最简单方法是使用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变量是一个输出字符串数组

也许您可以通过另一种方式获得相同的结果Get-Acl设置acl

最新更新