最近我不得不运行一个命令,不幸的是我要求我在命令行输入密码.
之后,我用"清除"清除了我的屏幕,但也希望清除命令历史记录,以便在会话历史记录中不会显示违规命令.遗憾的是,Clear-History cmdlet似乎并没有实际执行其文档所声称的内容 - 运行Clear-History似乎对会话历史记录没有任何影响.
我仍然可以在弹出的历史记录菜单中看到以前的命令,并通过按向上键滚动查看旧命令.这是一个显示问题的screengrab:

我已经使用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.
编辑:此帖子底部的解决方案.
着色Get-Childitem(换句话说,dir或ls)并不是一个新想法,但我无法在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(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) 我有一个在后台运行的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将保持聚焦.
无论如何,我正在寻找解决这个问题的方法.我在这里发现了很多关于类似问题的问题,但是所有问题都与创建/启动新表单有关,而不是使现有表单可见(除非我遗漏了一些东西).我可以重新编写应用程序,以便在每次需要时创建一个新表单,但这需要创建另一个表单,以便一直看不见只是为了等待热键事件,所以我宁愿保持原样.
有任何想法吗?