我编写了以下powershell代码,我正在尝试进一步优化这些代码。我基本上需要将这个代码块减少到259个字符以下。目前是319,我知道这是一个挑战。
使用正则表达式/通配符匹配/代码高尔夫的组合,我认为这是可能的。但这是我仍在学习的东西。
该函数将z文件中的每个字符转换为其capslock和numlock值,然后使用send键来解释使用灯光作为莫尔斯电码的形式,但使用二进制格式。
我需要这个从运行框中运行,因此有字符限制。
我为什么要这么做?我正在通过控制键盘上锁定键的通道传递数据。
powershell "foreach($b in $(cat $env:tmpz -En by)){foreach($a in 0x80,
0x40,0x20,0x10,0x08,0x04,0x02,0x01){if($b-band$a){$o+='%{NUMLOCK}'}else
{$o+='%{CAPSLOCK}'}}};$o+='%{SCROLLLOCK}';echo $o >$env:tmpz;$f=(cat $env:tmpz);Add-Type -A System.Windows.Forms;[System.Windows.Forms.SendKeys]::SendWait($f);rm $env:tmpz"
我正在工作,所以我还没有测试它,但我想我已经把它减少到268个字符了。同样,它需要在259或更低。
powershell "$d='$env:tmpz'%($b in $(cat -En by)){%($a in 0x80,
0x40,0x20,0x10,0x08,0x04,0x02,0x01){if($b-band$a){$o+='%{NUMLOCK}'}else
{$o+='%{CAPSLOCK}'}}};$o+='%{SCROLLLOCK}';echo $o >$d;$o=(cat $d);Add-Type -A *m.W*s.F*s;[*m.W*s.F*s.SendKeys]::SendWait($o);rm $d"
如果tmp文件夹中有一个名为";z";没有扩展,并且在运行代码后,锁钥匙的灯应该看起来像狂欢节。
为了以可读的格式发布整个代码,以下是包含Mclayton建议的结果:
# Gather the content from the file
# The use of (...) around the variable assignment lets the value pass through evaluating it as an expression.
Get-Content ($d=".desktopAbe.txt") -Encoding byte |
ForEach-Object -Process {
# Assign the current object in the pipeline to $b.
# This will allow the use of another Foreach-Object (%) for shorter code.
$b = $_;
128,64,32,16,8,4,2,1 |
Foreach-Object -Process {
# Append the results to $o as a concatenated string.
# Given a hashtable with the wanted values, you can access the value by providing the name in []'s.
# Since the bitwise operator -BAND only operates "properly" on two equal-length binary representations and if statement is needed.
# The if statement will return values 1/0 in accordance with -BAND
$o += "%{$(@{1="NUM";0="CAPS"}[$( if ($_-band$b) { 1 } else { 0 } )])LOCK}%{SCROLLLOCK}"
}
};
# Concatenate again to $o, while assigning to $f then outputting to $d.
($f = $o + "%{SCROLLLOCK}") | Out-File -FilePath $d;
Add-Type -AssemblyName 'System.Windows.Forms';
[System.Windows.Forms.SendKeys]::SendWait($f);
Remove-Item -Path $d
以及较短的形式:
gc ($d="$env:TEMPz") -en by|%{$b=$_;128,64,32,16,8,4,2,1|%{$o+="%{$(@{1="NUM";0="CAPS"}[$(if($_-band$b){1}else{0})])LOCK}%{SCROLLLOCK}"}};($f=$o+"%{SCROLLLOCK}")>$d;Add-Type -A *m.W*s.F*s;[System.Windows.Forms.SendKeys]::SendWait($f);rm $d
我在代码中添加了注释,只是为了将来的读者能够跟上。