PowerShell -Part 3
■ このスレッドは過去ログ倉庫に格納されています
@(1..1000; "complete!") -join " " >>5
実行してもツラツラと数字が表示されるだけ
作った本人だがセンスの無さが絶望的だと思う $popuko='';do{Write-Host ($pipimi = ($pptp = 'ポ', 'プ', 'テ', 'ピピック')[(Get-Random -Maximum 4)]) -No; $popuko += $pipimi; sleep -m 10}while($popuko -notmatch "ポプテピピック");"`r`n竹書房ゥァア゛ーッ" 本日ハマったこと
下記スクリプトがWin10上でのv2環境ではエラーになる。5.1環境ならもちろん問題なし
$URL = "適当なURL"
$Client = New-Object System.Net.WebClient
$URL.split('/')|%{$Fname=$_}
$Of = Join-Path (Split-Path $MyInvocation.MyCommand.Path) -ChildPath $Fname
$Client.DownloadFile($URL, $Of)
さんざん悩んだが旧OSの実機で検証したら問題なし
Win10のv2環境は実機と動作が違うんだね… WebClientってたしかブラウザ依存じゃなかったか パワーシェルからプログラムを呼び出してsendkeyでキーを送りたいのですが
呼び出したプログラムをターゲットウィンドウ固定にできないでしょうか
たとえばnotepadを呼び出してキーを送ろうとしても別ウィンドウクリックしてしまうと別ウィンドウにキーが送られてしまいます そもそもSendkeyでやることじゃない気がするぞ 豹変してて草
Sendkeyなんていう不安定なものを使う意図が本当に分からん add-type -AssemblyName microsoft.VisualBasic
$process = Get-Process |? {$_.MainWindowTitle -match "(探したいウィンドウタイトル)"}
[Microsoft.VisualBasic.Interaction]::AppActivate($process.ID)
とかやっとけば良くね?
PowerShell Coreじゃ動かんけどね RPAとか言い出すとほぼCoreで動かない物が出来上がりそう vista以降だとタスクバーペカるだけで最前面に来ないんよね
スクリプト手動実行なら動くんやけどさ Appactivateって結局そのウィンドウフォアグラウンドになるんでは?
背面のアプリに文字入力したいならいずれにせよSendkeysではムリ、
UWSCとかだとsenfstr(ID
,"文字列")とかで出来る Powershell用だと UI Autmation Extentionを使えば出来るのかも。試してはいないが 外部ソフトではなく、ウィンドウズ標準が良いです
なのでvbsでも良いですが
もしくはフォーカスでなくても常に最前面表示とかでもキー送れるのかな $code = @'
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
'@
Add-Type $code -Name Utils -Namespace Win32
Add-Type -AssemblyName System.Windows.Forms
if($ps = Get-Process|? {$_.MainWindowTitle -like "*メモ帳"}|Select-Object -First 1){
do{
[System.Windows.Forms.SendKeys]::SendWait("%+{TAB}")
Start-Sleep -m 100
$hwnd = [Win32.Utils]::GetForegroundWindow()
}while($hwnd -ne $ps.MainWindowHandle)
}
こんな感じ? Powershell使いこなすにはC#の知識にも手を出さないとダメかな
.NET使う時点でライブラリの知識いるけど
プロググラム経験無い自分には結構大変だわ 本日ハマり事案
下記スクリプトでは、なぜかRead-Host実行後にGet-Processの結果が表示されてしまう。なーぜだ?
Get-process|?{$_.MainWindowHandle -ne 0}|Select-Object ID,MainWindowHandle,Name,MainWindowTitle
read-host "Enterで終了します" >>28
read-host実行前にget-processの結果でるよ
何が問題なのかわかんない >>29
?自分のマシンでは出ないんだよね
Windows10 1803で $PSVersionTable
PSVersion 5.1.17134.228
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17134.228
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
なぜか
Get-Process の行のラストに |Format-Table
付ければ治るんだけど。それが見つかるまでああでもないこうでもないと2時間くらい…… セミコロンで繋げると再現する
Get-process|?{$_.MainWindowHandle -ne 0}|Select-Object ID,MainWindowHandle,Name,MainWindowTitle; read-host "Enterで終了します" 1行目の最後にOut-Hostをはさむと意図通りになる
Get-process|?{$_.MainWindowHandle -ne 0}|Select-Object ID,MainWindowHandle,Name,MainWindowTitle | Out-Host; read-host "Enterで終了します"
なんでかね こっちは1809だが-Version 2 指定してもセミコロンで繋いでも問題が再現しないよ
PowerShell core 6.1でも問題でない
$PSVersionTable
PSVersion 5.1.17763.1
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.1
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1 どうも Select-Object のバグっぽい
Get-ChildItem |Select BaseName でも起きる
Selectが後にパイプの別処理か、標準入力から改行受け取らないとコマンド終了判定できないっぽい >>32-33の$PSVersionTable
Name Value
---- -----
PSVersion 5.0.10586.117
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.10586.117
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1 >>34
お、そうなのか
5.1.17134.228 単体問題かなあ powershell v 2起動ではこちらも大丈夫だったよ -Version 2指定で大丈夫だった。ps5のバグだね >>36
Out-Host はこちらでも有効でした。
そちらの環境では; なしのps1スクリプトでは再現しないということだよね >>39
その通り
複数行 →再現せず
セミコロンで1行 →再現 ■ このスレッドは過去ログ倉庫に格納されています