如何在 PowerShell 中捕获 icacls.exe 的所有输出
How to capture all output from icacls.exe in PowerShell
我们有一个脚本,每周 运行 调整一次特定文件共享的所有权限。我主要为此使用 PowerShell 脚本,但也在某些部分执行 icacls.exe。由于文件较多,运行ning 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 变量是一个输出字符串数组。
也许换一种方式,你可以获得相同的
获取访问控制
设置 Acl
我们有一个脚本,每周 运行 调整一次特定文件共享的所有权限。我主要为此使用 PowerShell 脚本,但也在某些部分执行 icacls.exe。由于文件较多,运行ning 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 变量是一个输出字符串数组。
也许换一种方式,你可以获得相同的 获取访问控制 设置 Acl