Powershell 抛出导致变量清除?
Powershell Throw Causing Variables to Clear?
我的 PowerShell 脚本只检查多个服务器以确保输入* 和输出* 目录中没有任何文件。
我只是想在抛出错误消息之前输出以控制 GCI 调用的结果。但是,当我取消注释“throw”行时,$inputFiles 和 $outputFiles 不再输出到控制台。下面是代码:
$allServers = @(
"server1.com",
"server2.com")
foreach ($server in $allServers) {
$inputFiles = Get-ChildItem -Path "\$server\C$\jobs\statements\input*\" -Recurse | Where-Object {! $_.PSIsContainer } | Select FullName
$outputFiles = Get-ChildItem -Path "\$server\C$\jobs\statements\output*\" -Recurse | Where-Object {! $_.PSIsContainer } | Select FullName
if ($inputFiles -eq $NULL -and $outputFiles -eq $NULL) {
Write-Host "Environment is ready for statement processing."
}
else {
Write-Host "Environment is NOT ready for statement processing."
Write-Host "The following files exist in input/output: `n"
$inputFiles
$outputFiles
#Throw "Files exist in input/output. See above for details."
}
}
控制台输出如下:
Environment is NOT ready for statement processing.
The following files exist in input/output:
Environment is NOT ready for statement processing.
The following files exist in input/output:
FullName
--------
\server1.com\C$\jobs\statements\input\asdasd.txt
\server1.com\C$\jobs\statements\input_254\asdasd.txt
\server1.com\C$\jobs\statements\input_test\asdasd.txt
\server2.com\C$\jobs\statements\input\CUSSTAT10302021.245
\server2.com\C$\jobs\statements\input\CUSSTAT11312021
\server2.com\C$\jobs\statements\input\CUSSTAT11312021.zip
下面是我取消注释“throw”行时的控制台输出:
Environment is NOT ready for statement processing.
The following files exist in input/output:
Files exist in input/output. See above for details.
At C:\jobs\statements\bin\Statements-EnvironmentCheck.ps1:47 char:9
+ Throw "Files exist in input/output. See above for details."
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Files exist in ...ve for details.:String) [], RuntimeException
+ FullyQualifiedErrorId : Files exist in input/output. See above for details.
我知道我需要执行一些错误输出清理以包括所有可能存在文件的服务器,但请暂时忽略它。
您遇到的问题在 and this answer中有解释,基本上您需要实施Out-Host
\Out-Default
:
$inputFiles, $outputFiles | Out-Host # Should fix the problem
# possibly `throw` might require this too
throw "Files exist in input/output. See above for details." | Out-Host
但是,我觉得值得向您展示一种处理代码的更好方法,返回一个统一的对象数组,您可以过滤、排序和导出。
$allServers = @(
"server1.com"
"server2.com"
)
$result = foreach ($server in $allServers) {
# use `-File` instead of `! $_.PSIsContainer`
$out = @{
in = Get-ChildItem "\$server\C$\jobs\statements\input*\" -Recurse -File
out = Get-ChildItem "\$server\C$\jobs\statements\output*\" -Recurse -File
}
# if $out['in'] and $out['out'] are `$null`, Ready is `$true`
[pscustomobject]@{
Ready = -not($out['in'] -or $out['out'])
Server = $server
Files = $out
}
}
现在,如果您想查看哪些服务器 就绪(input
和 output
中没有文件):
$result.where{ $_.Ready }
如果您想查看哪些服务器未就绪,并获得文件列表:
$result.where{ -not $_.Ready }.foreach{
foreach($file in $_.Files.PSBase.Values.FullName) {
[pscustomobject]@{
Server = $_.Server
Files = $file
}
}
}
我的 PowerShell 脚本只检查多个服务器以确保输入* 和输出* 目录中没有任何文件。
我只是想在抛出错误消息之前输出以控制 GCI 调用的结果。但是,当我取消注释“throw”行时,$inputFiles 和 $outputFiles 不再输出到控制台。下面是代码:
$allServers = @(
"server1.com",
"server2.com")
foreach ($server in $allServers) {
$inputFiles = Get-ChildItem -Path "\$server\C$\jobs\statements\input*\" -Recurse | Where-Object {! $_.PSIsContainer } | Select FullName
$outputFiles = Get-ChildItem -Path "\$server\C$\jobs\statements\output*\" -Recurse | Where-Object {! $_.PSIsContainer } | Select FullName
if ($inputFiles -eq $NULL -and $outputFiles -eq $NULL) {
Write-Host "Environment is ready for statement processing."
}
else {
Write-Host "Environment is NOT ready for statement processing."
Write-Host "The following files exist in input/output: `n"
$inputFiles
$outputFiles
#Throw "Files exist in input/output. See above for details."
}
}
控制台输出如下:
Environment is NOT ready for statement processing.
The following files exist in input/output:
Environment is NOT ready for statement processing.
The following files exist in input/output:
FullName
--------
\server1.com\C$\jobs\statements\input\asdasd.txt
\server1.com\C$\jobs\statements\input_254\asdasd.txt
\server1.com\C$\jobs\statements\input_test\asdasd.txt
\server2.com\C$\jobs\statements\input\CUSSTAT10302021.245
\server2.com\C$\jobs\statements\input\CUSSTAT11312021
\server2.com\C$\jobs\statements\input\CUSSTAT11312021.zip
下面是我取消注释“throw”行时的控制台输出:
Environment is NOT ready for statement processing.
The following files exist in input/output:
Files exist in input/output. See above for details.
At C:\jobs\statements\bin\Statements-EnvironmentCheck.ps1:47 char:9
+ Throw "Files exist in input/output. See above for details."
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Files exist in ...ve for details.:String) [], RuntimeException
+ FullyQualifiedErrorId : Files exist in input/output. See above for details.
我知道我需要执行一些错误输出清理以包括所有可能存在文件的服务器,但请暂时忽略它。
您遇到的问题在Out-Host
\Out-Default
:
$inputFiles, $outputFiles | Out-Host # Should fix the problem
# possibly `throw` might require this too
throw "Files exist in input/output. See above for details." | Out-Host
但是,我觉得值得向您展示一种处理代码的更好方法,返回一个统一的对象数组,您可以过滤、排序和导出。
$allServers = @(
"server1.com"
"server2.com"
)
$result = foreach ($server in $allServers) {
# use `-File` instead of `! $_.PSIsContainer`
$out = @{
in = Get-ChildItem "\$server\C$\jobs\statements\input*\" -Recurse -File
out = Get-ChildItem "\$server\C$\jobs\statements\output*\" -Recurse -File
}
# if $out['in'] and $out['out'] are `$null`, Ready is `$true`
[pscustomobject]@{
Ready = -not($out['in'] -or $out['out'])
Server = $server
Files = $out
}
}
现在,如果您想查看哪些服务器 就绪(input
和 output
中没有文件):
$result.where{ $_.Ready }
如果您想查看哪些服务器未就绪,并获得文件列表:
$result.where{ -not $_.Ready }.foreach{
foreach($file in $_.Files.PSBase.Values.FullName) {
[pscustomobject]@{
Server = $_.Server
Files = $file
}
}
}