【问题标题】:Exit from while loop but keep shell open: powershell退出while循环但保持shell打开:powershell
【发布时间】:2021-06-06 20:06:48
【问题描述】:

为了学习 Powershell,我编写了一个脚本,从列表中随机选择一部电影,直到列表用完,但是,在列表的末尾,我希望 shell 保持打开...我尝试了很多选项Break/Return/exit... 无事可做... 尝试将最后一个 if 条件添加到 while 条件中,但不起作用,在列表末尾出现一条错误消息,指出数组为空/null,或者 shell 在最后一部电影后退出......

是的,我可以用pause 代替return,因为那个脚本没问题,但它似乎不是一个“优雅”的解决方案...

锦上添花将是修剪电影名称扩展名的更好选择..!因为在我的模式中,电影名称以"m""k""v" 结尾,这些字符与".mkv" 表达式一起被修剪掉! :)

有人可以开车送我吗?

这是代码:

$LastFile = (Get-Item "F:\DATA\Films list\*" | Where-Object {$_.Name -match "Title"} | sort LastWriteTime | select -last 1).FullName
$TitleList = Get-Content $LastFile | where { $_ -notmatch "4K" }
$TitleList.Count

$Listed = New-Object System.Collections.ArrayList
Foreach ( $film in $TitleList ) {
    $Listed.Add("$film") | out-null
    }
$RandomFilm = Get-Random -InputObject $Listed
Write-Host $RandomFilm.Trim('.mkv') -ForegroundColor Green
$Listed.Remove("$RandomFilm") 
$TitleCount = 1

echo "_________________________________________________________________________________________"
echo "`n`n" 
$Answer = Read-Host "RETURN for new film, q for quitting..." 

while ( "q" -notcontains $Answer) {
    echo "`n`n"
    $RandomFilm = Get-Random -InputObject $Listed 
    if ( $RandomFilm -ne $null ) {
        Write-Host $RandomFilm.Trim('.mkv') -ForegroundColor Green
        $Listed.Remove("$RandomFilm")
        $TitleCount++
        $TitleCount
        if ( $TitleCount -gt $TitleList.Count ) {
            Write-Host "END OF LIST..." -ForegroundColor red
            Return
            }
        else {
            echo "_________________________________________________________________________________________"
            echo "`n`n"
            $Answer = Read-Host "RETURN for new film, q for quitting..."
            }
    }
}   

【问题讨论】:

    标签: powershell while-loop exit break


    【解决方案1】:

    有几种方法可以做到这一点。如果您使用 powershell 运行脚本,那么脚本末尾的 $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 是一个不错的选择(这不适用于 powershell_ise tho)。在 ISE 中,您可以在最后添加一个读取主机。 如果您从快捷方式运行脚本,您可以添加 -NoExit: powershell.exe -NoExit -file .\script.ps1

    锦上添花将是修剪电影名称扩展名的更好选择..!因为在我的模式中,电影名称以“m”、“k”或“v”结尾,这些字符与“.mkv”表达式一起被修剪掉! :)

    我不太确定我是否理解这部分,请您详细说明。

    【讨论】:

    • if ( $RandomFilm.EndWith(".mkv") { $RandomFile = $RandomFile.Remove($RandomFile.Length-4) }
    • @santisq,嗨,santis,尝试过$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown"),似乎不起作用,shell 仍在退出...关于“结冰..”,我的意思是“The Mask.mkv”是这样修剪的“马斯”!
    • stackoverflow.com/questions/20886243/press-any-key-to-continue 检查此链接。关于修剪问题,如果所有文件都是“.mkv”,您可以使用'The Mask.mkv' -replace '.mkv''The Mask.mkv'.replace('.mkv','')'The Mask.mkv'.split('.')[0]
    • @Tim Roberts 谢谢蒂姆,完美!仅针对“复制和粘贴”的人:$Random**Film**.Remove($Random**Film**.Length-4) :)
    • @santisq,是的,santis,正如我所说,pause 是一个解决方案,但我更喜欢学习另一种/更好/正确的技术!
    猜你喜欢
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多