小编Fop*_*ush的帖子

PowerShell的Clear-History不会清除历史记录

最近我不得不运行一个命令,不幸的是我要求我在命令行输入密码.

之后,我用"清除"清除了我的屏幕,但也希望清除命令历史记录,以便在会话历史记录中不会显示违规命令.遗憾的是,Clear-History cmdlet似乎并没有实际执行其文档所声称的内容 - 运行Clear-History似乎对会话历史记录没有任何影响.

我仍然可以在弹出的历史记录菜单中看到以前的命令,并通过按向上键滚动查看旧命令.这是一个显示问题的screengrab:

PowerShell清除历史记录失败

我已经使用Get-Command验证了Clear-History确实正在执行预期的内置PowerShell cmdlet.

我尝试了一些变体,例如"Clear-History -count 10 -newest",都没有显示出任何效果.当我指定确切的历史ID时,例如"Clear-History -id 3",我收到如下错误:

Clear-History : Cannot locate history for Id 3.
Run Code Online (Sandbox Code Playgroud)

即使我可以在屏幕上看到命令#3.

powershell history

40
推荐指数
4
解决办法
3万
查看次数

Powershell:一劳永逸地为Get-Childitem输出着色

编辑:此帖子底部的解决方案.

着色Get-Childitem(换句话说,dirls)并不是一个新想法,但我无法在Powershell中找到任何理想的输出着色方法.编写color-ls函数有两种通用方法:

  • 拦截Get-Childitem的输出,并使用带有-ForegroundColor参数的Write-Host将其重新输出为文本.此方法允许尽可能多的粒度,但将Get-Childitem的输出减少为文本.正如大多数PowerShell用户所知,Get-Childitem不输出文本,而是输出对象.具体来说,是FileInfo和DirectoryInfo对象的列表.这使得处理Get-Childitem输出具有很大的灵活性.

  • 将Get-Childitem的输出通过Invoke-Expression传递给Foreach-Object,在输出每个对象之前更改控制台前景色.有点满口,但更好的选择,因为它保留了Get-Childitem的输出类型.

以下是Tim Johnson的Powershell博客提供的后一种方法的示例.

function color-ls
{
    $regex_opts = ([System.Text.RegularExpressions.RegexOptions]::IgnoreCase `
          -bor [System.Text.RegularExpressions.RegexOptions]::Compiled)
    $fore = $Host.UI.RawUI.ForegroundColor
    $compressed = New-Object System.Text.RegularExpressions.Regex(
          '\.(zip|tar|gz|rar|jar|war)$', $regex_opts)
    $executable = New-Object System.Text.RegularExpressions.Regex(
          '\.(exe|bat|cmd|py|pl|ps1|psm1|vbs|rb|reg)$', $regex_opts)
    $text_files = New-Object System.Text.RegularExpressions.Regex(
          '\.(txt|cfg|conf|ini|csv|log|xml|java|c|cpp|cs)$', $regex_opts)

    Invoke-Expression ("Get-ChildItem $args") | ForEach-Object {
        if ($_.GetType().Name -eq 'DirectoryInfo') 
        {
            $Host.UI.RawUI.ForegroundColor = 'Magenta'
            echo $_
            $Host.UI.RawUI.ForegroundColor = $fore
        }
        elseif ($compressed.IsMatch($_.Name)) 
        {
            $Host.UI.RawUI.ForegroundColor = 'darkgreen'
            echo $_
            $Host.UI.RawUI.ForegroundColor = $fore
        }
        elseif ($executable.IsMatch($_.Name))
        {
            $Host.UI.RawUI.ForegroundColor = …
Run Code Online (Sandbox Code Playgroud)

powershell colors

37
推荐指数
2
解决办法
1万
查看次数

Powershell非定位,可选参数

我正在尝试创建一个powershell(2.0)脚本,它将接受遵循此基本模式的参数:

.\{script name} [options] PATH
Run Code Online (Sandbox Code Playgroud)

选项是任意数量的可选参数 - 按照'-v'的方式考虑详细.PATH参数将只是最后传递的参数,并且是必需的.可以在没有选项和只有一个参数的情况下调用脚本,并且该参数将被假定为Path.我在设置仅包含可选参数但也非位置的参数列表时遇到问题.

这个快速脚本演示了我遇到的问题:

#param test script
Param(
    $firstArg,
    $secondArg,
    [switch]$thirdArg,
    [Parameter(ValueFromRemainingArguments = $true)]
    $remainingArgs)

write-host "first arg is $firstArg"
write-host "second arg is $secondArg"
write-host "third arg is $thirdArg"
write-host "remaining: $remainingArgs"
Run Code Online (Sandbox Code Playgroud)

当这样调用时:

.\param-test.ps1 firstValue secondValue
Run Code Online (Sandbox Code Playgroud)

脚本输出:

first arg is firstValue
second arg is secondValue
third arg is False
remaining:
Run Code Online (Sandbox Code Playgroud)

试图创建的行为将使两个参数都通过可选参数落在最后的remainingArgs变量中.

这个问题/答案有助于提供一种实现所需行为的方法,但它似乎只有至少有一个强制参数才有效,并且只有在它出现所有其他参数之前.

我可以通过强制firstArg并指定0的位置来演示此行为:

#param test script
Param(
    [Parameter(Mandatory=$true, Position = 0)]
    $firstArg,
    $secondArg,
    [switch]$thirdArg,
    [Parameter(ValueFromRemainingArguments = $true)]
    $remainingArgs)

    write-host …
Run Code Online (Sandbox Code Playgroud)

powershell scripting arguments

17
推荐指数
1
解决办法
3万
查看次数

当我将可见的正确设置为true时,如何防止我的C#winforms应用程序窃取焦点?

我有一个在后台运行的C#winforms应用程序,正在监听要按下的热键.当按下热键时,我的表格会短暂出现.表单始终在运行,但设置为隐藏,直到我收到热键事件,此时我将visible属性设置为true.代码如下所示:

void hook_volumeDown(object sender, KeyPressedEventArgs e)
{
    this.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)

应该注意,此表单的最顶层属性设置为true.

真正奇怪的是,在我的C#应用​​程序从另一个应用程序中窃取焦点后,它将再也不会这样做了.例如:我启动我的应用程序,然后启动一些像Team Fortress 2这样的fullscreep应用程序.然后我按下我的热键.Team Fortress 2最小化,我看到了我的形式.然而,然后,我可以恢复TF2,并再次按我的热键我想要的(具有所需的效果),TF2将保持聚焦.

无论如何,我正在寻找解决这个问题的方法.我在这里发现了很多关于类似问题的问题,但是所有问题都与创建/启动新表单有关,而不是使现有表单可见(除非我遗漏了一些东西).我可以重新编写应用程序,以便在每次需要时创建一个新表单,但这需要创建另一个表单,以便一直看不见只是为了等待热键事件,所以我宁愿保持原样.

有任何想法吗?

c# focus visible winforms

6
推荐指数
1
解决办法
2816
查看次数

标签 统计

powershell ×3

arguments ×1

c# ×1

colors ×1

focus ×1

history ×1

scripting ×1

visible ×1

winforms ×1