如何在 PowerShell 中检查现有文件后关闭表单 GUI?

2023-12-31

我想检查一个现有的文件,如果进程仍在等待该文件,它将显示一个GUI窗口。文件存在后,窗口将自动关闭。

我尝试了这段代码,窗口无法关闭,即使文件已经存在。

检查文件:

$SN = "708TSTA"
$MAC = "2E5961370"

function Find {
    $n = 0
    while (-not (Get-ChildItem -Name "D:\SERVER\" | Where-Object {$_ -like "*$SN-$MAC*"})) {
        Start-Sleep -s 1
        D:\Auto\GUI.ps1
        $n++
        (Get-ChildItem -Name "D:\SERVER\" | Where-Object {$_ -like "*$SN-$MAC*"})
        Write-Host "Attempt no $n"
    }

    Write-Host ">>Flag found after $n attempts"
    return $true
}

if (Find) {
    Write-Host "Found"
}

GUI.ps1:

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                 = New-Object System.Windows.Forms.Form
$Form.ClientSize      = '578,400'
$Form.Text            = "Form"
$Form.BackColor       = "#c1daf7"
$Form.WindowState     = 'Maximized'
$Form.FormBorderStyle = "FixedDialog"

$Label1               = New-Object System.Windows.Forms.Label
$Label1.Text          = "UNDER PROCESS"
$Label1.AutoSize      = $true
$Label1.Width         = 25
$Label1.Height        = 10
$Label1.Location      = New-Object System.Drawing.Point(600,300)
$Label1.Font          = 'Microsoft Sans Serif,30,style=Bold,Underline'
$Label1.ForeColor     = "#d0021b"

$Label2               = New-Object System.Windows.Forms.Label
$Label2.Text          = "WAITING"
$Label2.AutoSize      = $true
$Label2.Width         = 25
$Label2.Height        = 10
$Label2.Location      = New-Object System.Drawing.Point(770,500)
$Label2.Font          = 'Microsoft Sans Serif,20,style=Bold'
$Label2.ForeColor     = "#fb0505"

$Check = Get-ChildItem -Name "D:\SERVER\" | Where-Object {$_ -like "*$SN-$MAC*"}
if($Check) {
    Write-Host "File Exist"
    $Form.Close()
}

$Form.Controls.AddRange(@($Label1,$Label2))
[void]$Form.ShowDialog()

而不是做Start-Sleep在 GUI 中,最好使用计时器,以便表单保持响应。

我更改了 GUI.ps1 的代码(不是它看起来的样子),如下所示:

Param (   
    [string]$Path = '*.*',
    [string]$MaxAttempts = 5
) 

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

# set things up for the timer
$script:nAttempts = 0
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 1000  # 1 second
$timer.Add_Tick({
    $global:Result = $null
    $script:nAttempts++
    $file = Get-Item -Path $Path
    if ($file) {
        $global:Result = [PSCustomObject]@{
            Exists   = $true
            FileName = $file.FullName
            Attempts = $script:nAttempts
        }
        $timer.Dispose()
        $Form.Close()
    }
    elseif ($script:nAttempts -ge $MaxAttempts) {
        $global:Result = [PSCustomObject]@{
            Exists   = $false
            FileName = ''
            Attempts = $script:nAttempts
        }
        $timer.Dispose()
        $Form.Close()
    }
})

$Form                 = New-Object System.Windows.Forms.Form
$Form.ClientSize      = '578,400'
$Form.Text            = "Form"
$Form.BackColor       = "#c1daf7"
$Form.WindowState     = 'Maximized'
$Form.FormBorderStyle = "FixedDialog"

$Label1               = New-Object System.Windows.Forms.Label
$Label1.Text          = "UNDER PROCESS"
$Label1.AutoSize      = $true
$Label1.Width         = 25
$Label1.Height        = 10
$Label1.Location      = New-Object System.Drawing.Point(600,300)
$Label1.Font          = 'Microsoft Sans Serif,30,style=Bold,Underline'
$Label1.ForeColor     = "#d0021b"

$Label2               = New-Object System.Windows.Forms.Label
$Label2.Text          = "WAITING"
$Label2.AutoSize      = $true
$Label2.Width         = 25
$Label2.Height        = 10
$Label2.Location      = New-Object System.Drawing.Point(770,500)
$Label2.Font          = 'Microsoft Sans Serif,20,style=Bold'
$Label2.ForeColor     = "#fb0505"

$Form.Controls.AddRange(@($Label1,$Label2))

# start the timer as soon as the dialog is visible
$Form.Add_Shown({ $timer.Start() })

[void]$Form.ShowDialog()

# clean up when done
$Form.Dispose()

要从其他脚本调用它,请使用:

$SN  = "708TSTA"
$MAC = "2E5961370"

function Test-FileExists {
    $file = Get-Item -Path "D:\*$SN-$MAC*"
    if ($file) {
        $global:Result = [PSCustomObject]@{
            Exists   = $true
            FileName = $file.FullName
            Attempts = 1
        }
    }
    else {
        & "D:\GUI.ps1" -Path "D:\*$SN-$MAC*" -MaxAttempts 3
    }
}

# call the function that can call the GUI.ps1 script
Test-FileExists

# check the Global result object
if ($global:Result.Exists) {
    Write-Host "File '$($global:Result.FileName)' Exists. Found after $($global:Result.Attempts) attempts." -ForegroundColor Green
}
else {
    Write-Host "File not found after $($global:Result.Attempts) attempts." -ForegroundColor Red
}

Update

根据您的评论,我知道调用脚本应该显示表单(它不执行屏幕上显示的任何操作),并负责在找到文件后关闭它。

下面的代码应该通过将 $Form 定义为全局变量并使用.Show()形式的方法而不是ShowDialog():

GUI.ps1

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$global:Form                 = New-Object System.Windows.Forms.Form
$global:Form.ClientSize      = '578,400'
$global:Form.Text            = "Form"
$global:Form.BackColor       = "#c1daf7"
$global:Form.WindowState     = 'Maximized'
$global:Form.FormBorderStyle = "FixedDialog"
$global:Form.ControlBox      = $false  # hide sizing and close buttons
$global:Form.TopMost         = $true

$Label1               = New-Object System.Windows.Forms.Label
$Label1.Text          = "UNDER PROCESS"
$Label1.AutoSize      = $true
$Label1.Width         = 25
$Label1.Height        = 10
$Label1.Location      = New-Object System.Drawing.Point(600,300)
$Label1.Font          = 'Microsoft Sans Serif,30,style=Bold,Underline'
$Label1.ForeColor     = "#d0021b"

$Label2               = New-Object System.Windows.Forms.Label
$Label2.Text          = "WAITING"
$Label2.AutoSize      = $true
$Label2.Width         = 25
$Label2.Height        = 10
$Label2.Location      = New-Object System.Drawing.Point(770,500)
$Label2.Font          = 'Microsoft Sans Serif,20,style=Bold'
$Label2.ForeColor     = "#fb0505"

$global:Form.Controls.AddRange(@($Label1,$Label2))

# don't use ShowDialog() here because it will block the calling script
$global:Form.Show()

调用脚本

function Test-FileExists {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
        [string]$Path,
        [string]$Pattern = '*.*'
    )
    $nAttempts = 1
    $file = Get-ChildItem -Path $Path -Filter $Pattern -File | Select-Object -First 1
    if (!$file) {
        # show the GUI
        & "D:\GUI.ps1"

        do {
            Start-Sleep -Seconds 1
            $nAttempts++
            Write-Verbose "Attempt No. $nAttempts"
            $file = Get-ChildItem -Path $Path -Filter $Pattern -File | Select-Object -First 1
        } until ($file)
        # clean up the form
        $global:Form.Dispose()
        $global:Form = $null
    }

    Write-Verbose "File '$($file.FullName)' Exists. Found after $nAttempts attempt(s)."
    return $true
}


$SN  = "708TSTA"
$MAC = "2E5961370"

# call the function that can call the GUI.ps1 script
if (Test-FileExists -Path 'D:\SERVER\SHARE' -Pattern "*$SN-$MAC*" -Verbose) {
    Write-Host "Found"
}

希望有帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PowerShell 中检查现有文件后关闭表单 GUI? 的相关文章

  • 如何使用 gnuwin32 Makefile 执行 powershell/cmd 命令?

    我尝试使用以下 makefile 处理器在 Windows 的 makefile 中使用curl rm start 等命令 http gnuwin32 sourceforge net packages make htm http gnuwi
  • 我正在为 cmd 编写包装器,但在重定向标准输入时遇到问题

    好的 这就是我正在做的 我想编写一个 net 应用程序 将标准输出 输入重定向到 Richtextbox 我已经让它工作得很好 但是一旦我将标准输入添加到混合中 我的读取命令就会冻结 这是我的表单中的相关代码 Shell new Proce
  • 用于替换文件中的文本块的 PowerShell 命令

    我正在尝试使用 PowerShell 替换文件中的一段文本 例如 我有一个 sql 文件 并且我知道该特定文件中需要替换的 SQL 脚本的确切块 通读一些 PowerShell 替换示例后 PowerShell 似乎以数组形式返回文件内容
  • winforms可以使用otf字体吗?

    我尝试过在标签 文本框以及在绘画事件中绘图时使用开放式字体 但这不起作用 有什么方法可以让 Open Type Font 工作吗 这在 Winforms 中是不可能的 GDI 仅支持 TrueType 字体 您必须迁移到 WPF 才能获得
  • Flowlayout 面板和自动调整子控件大小不起作用

    我试图在 winform C NET 上获得一个非常简单的自动调整大小布局 我尝试过 TableLayoutPanels 和 FlowLayoutPanels 但没有任何效果 我有一个用户控件 它是在运行时创建的其他用户控件的容器 我将其称
  • 将子进程的输出重定向到父进程 - Powershell

    我有 powershell 进程 并且我正在调用 Start Process 或 System Diagnostic Process 以作为不同用户启动子进程 以获取其他用户环境变量 我尝试使用重定向输出 但它不起作用 下面是代码 proc
  • 输入编码:接受UTF-8

    我需要在 PowerShell 下获取本机应用程序的输出 问题是 输出是用 UTF 8 无 BOM 编码的 PowerShell 无法识别它 只是将那些时髦的 UTF 字符直接转换为 Unicode 我发现 PowerShell 有 Out
  • Powershell 在全局级别应用详细信息

    想象一下 如果您有一个包含一行代码的脚本 例如 ni type file foobar txt 其中 verbose 标志未提供给 ni 命令 如果我要运行此脚本来强制详细程度 有没有办法在全局 PSSession 级别设置详细程度 我问的
  • 使用 ICACLS 将文件权限设置为“只读”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我很难从简单 直观的方式转变过来chmod 400尝试在 Windows 命令提示符中执行相同的操作ICACLS 与 UNIX LINUX
  • 在winforms中用HttpWebRequest传递cookie?

    请看下面的代码 objCookieContainer new CookieContainer HttpWebRequest request HttpWebRequest WebRequest Create http website com
  • Windows / Powershell 将程序版本获取到变量中

    我很接近 但不在那儿 我可以通过 powershell 获取应用程序的版本 但它附带一堆文本 这个命令 powershell NoLogo NoProfile Command get item Path c myapp exe Versio
  • 使用 PowerShell 复制源服务器同一目录结构中的文件夹和子文件夹中的项目文件

    我正在努力让下面的脚本以正确的结构复制文件夹和子文件夹中的文件 作为源服务器 可以说 有下面提到的文件夹 主文件夹 文件aaa 文件bbb 子文件夹a 文件1 文件2 文件3 子文件夹b 文件4 文件5 文件6 使用的脚本 Get Chil
  • Copy-Item 将目录及其内容复制到 UNC 路径

    我正在尝试使用 PowerShell 1 0 获取文件夹的内容并将其复制到另一个文件夹 非常简单的东西 使用起来一切都很好Copy Item from to recurse如果我从本地文件夹复制到本地文件夹 然而 如果 to变量是一个UNC
  • 基于团体成员资格的额外输出

    我希望你们都度过愉快的一天 如果这是一个糟糕的问题尝试 我提前道歉 我不太擅长这个 介绍 首先 我想介绍一下我实际正在创作的内容 我为 MSP 工作 我的任务是创建一个供我们的一位客户使用的用户管理 Powershell 脚本 以便我们可以
  • 阻止直到表单关闭?窗体

    我有一个启动 formB 的表单 我希望将 forma 隐藏起来 直到 form 关闭 formC 和其他人可能打开了一个更改表单 所以我根本无法创建一个新表单 有没有办法启动 formB 隐藏并阻止直到关闭 这应该可以做到 this Vi
  • 如果未安装软件则安装 Chocolatey 软件包,但如果已安装较新版本的软件则跳过安装?

    我使用以下 PowerShell 脚本通过 Octopus 部署步骤安装 dotnetcore windowshosting 版本 1 1 1 ChocolateyPackageId 等于 dotnetcore windowshosting
  • 如何增加工具条上按钮的大小?

    我已在表单中添加了一个工具条 在此工具条中 我在 添加工具条 按钮的帮助下有一些按钮 这些按钮的默认尺寸为 22 20 但我想将按钮的尺寸更改为 25 50 我通过更改尺寸属性在设计器中进行了更改 但它没有反映在我的表单中 即使我改变工具条
  • CefWebBrowser 不显示

    解决方案 该问题是由于Program cs中未加载CefRuntime造成的 只需将示例文件中的所有代码复制到您的 Program cs 中即可 然后 如果您的 CefWebBrowser 卡住并出现 旋转等待鼠标光标 则设置 Single
  • 我怎么知道PowerShell函数参数被省略了

    考虑这样的函数 function Test foo bar 我们可以称之为 Test foo null Test 我如何知道何时省略了 foo 以及何时为 null 如果您使用的是 Powershell V2 或更高版本 则可以使用 PSB
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1

随机推荐

  • ANSI C 中的复合语句(块)是否被括号表达式包围?

    浏览我找到的 Linux 内核源代码一些代码 http lxr linux no linux v2 6 30 arch x86 include asm uaccess h L332其中括号包围的语句块被视为表达式口齿不清 或ML 即一个表达
  • 为 iPad 进行编译时是否设置了特定的 Xcode 编译器标志?

    为 iPad 进行编译时是否设置了特定的 Xcode 编译器标志 我想有条件地编译 iPad 与 iPhone iPod Touch 代码 例如 ifdef TARGET IPAD code for iPad else code for i
  • Eclipse 3.7 Indigo:“关于对话框”错误

    我最近将 Eclipse 3 6 实例升级到 3 7 我想查看 帮助 gt 关于 Eclipse 选项 但没有显示此对话框 使用 consoleLog debug 选项运行它以了解可能出现的问题 这就是我所看到的 有什么想法吗 顺便说一句
  • 将 ETag / Last-Modified 装饰器与 Django 基于类的通用视图一起使用

    我最近将 Django 项目之一中的所有视图迁移到新的基于类的视图 对于经典的基于函数的 Django 视图 有一个方便的装饰器django views decorators http condition如果存在与您指定的条件匹配的缓存副本
  • 反应堆模式在 Node.js 中如何工作?

    我正在阅读 Node js 设计模式 我陷入了对反应堆模式的理解中 我在这里没有看到任何调用堆栈 我认为调用堆栈是 Node js 设计的主要部分之一 谁能帮我理解这张图吗 此外 没有回调队列 一切都从应用程序开始 应用程序发出请求 事件多
  • 如何在 AngularJS 中大写和大写?

    我想将 HTML 表单中的某些字段大写 大写 HTML
  • 将 QMatrix4x4 与 OpenGL 函数结合使用

    有没有简单的使用方法QMatrix4x4与 OpenGL 功能 特别是glMultMatrixf 如果我理解正确的话 我必须转置矩阵 并确保转换qreal 可以是float or double取决于底层系统 GLfloat 没有一个函数可以
  • 在sql server中存储图像

    我正在尝试将数据库设计放在一起来存储图像 你们中的许多人可能有过设计数据库来存储图像的经验以及与之相关的挑战 数据库最终可能会存储数十万张图像 我计划使用 SQL Server 2008 数据库和实体框架 计划使用 FILESTREAM 数
  • MPI_Allgather 和 MPI_Allgatherv 之间的区别

    有什么区别MPI Allgather and MPI Allgatherv 来自MPI标准 http www mpi forum org docs MPI GATHERV 扩展了功能 MPI GATHER 通过允许变化 每个进程的数据计数
  • 离屏和嵌入式浏览器比较(用于游戏)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们一直在考虑为我们的 C 应用程序添加良好的浏览器支持 这个问题是关于独立于 GUI 的浏览器库 因为
  • 如何在类扩展中添加静态(存储)属性来创建单例? (迅速)

    我想将这段代码转换为 Swift 这里的 Objective C 代码正在创建一个单例对象 如果我可以这样描述的话 我可以用调度一次 t来转换它 但我想使用一种更优雅的方式 应该类似于 静态让捆绑 NSBundle But 静态让捆绑 NS
  • C# WebBrowser 控件——AJAX 之后获取文档元素?

    我正在编写一个应用程序 它使用 WebBrowser 控件来查看可通过添加新内容 元素的 AJAX 进行更改的 Web 内容 我似乎无法以我尝试过的任何方式获得新元素 BrowserCtl DocumentText 没有最新的页面 当然它也
  • Zend 可重用小部件/插件/迷你应用程序?

    我是 Zend 框架的新手 并试图获得一些有关代码可重用性的见解 我确实了解模块 但对于哪些功能应该进入模块以及哪些功能不应该进入模块似乎存在一些不确定性 我正在努力实现的目标 1 拥有可重用的小程序 小部件 插件 无论您如何称呼它们 可以
  • TransitionFromView 删除之前的视图

    我在应用程序中的视图之间转换时使用 TransitionfromView 时遇到问题 Setup 这是视图控制器的基本设置 它有两个视图 一个 MKMapView 和一个 UITableView 当按下切换按钮时 应该在地图和表格之间交替视
  • 使用 Bundler 安装 Gems == 大问题

    如果我跑bundle install 一切都会过去 我重新启动 nginx 当我访问该网站时 我看到乘客错误如下 git github com spree spree git at master is not checked out Ple
  • 使用 JavaScript 在特定延迟后执行脚本

    有没有类似 jQuery 的 JavaScript 方法delay or wait 将脚本的执行延迟特定的时间 只是为了补充其他人所说的内容setTimeout 如果以后想调用带参数的函数 就需要设置一些匿名函数调用 您需要将该函数作为参数
  • Golang 的 Codeclimate 测试覆盖率格式化程序

    无处可去Codeclimate 文档 https docs codeclimate com v1 0 docs setting up test coverage section supported languages and formats
  • 控制模板可见性触发器

    我对下面的按钮样式所做的只是让按钮仅在 IsMouseOver 或 IsPressed 时可见 它的编写方式甚至无法编译 找不到 Glyph 如何清理这个问题 直到 IsMoueOver 时按钮可见 Cheers Berryl
  • 我应该等待 ValueTask 吗?

    这将是一个有效的实施ValueTask请 缓存服务从缓存或数据库返回数据 public async ValueTask
  • 如何在 PowerShell 中检查现有文件后关闭表单 GUI?

    我想检查一个现有的文件 如果进程仍在等待该文件 它将显示一个GUI窗口 文件存在后 窗口将自动关闭 我尝试了这段代码 窗口无法关闭 即使文件已经存在 检查文件 SN 708TSTA MAC 2E5961370 function Find n