お前ら、wsh使ってますか? Part8
レス数が900を超えています。1000を超えると表示できなくなるよ。
こんなことコンピュータにやらせろよ。そう思ったことはありませんか?
簡易的な実行環境も含めて普通のOSだったら当たり前に備わっている自動実行。
Windowsの標準に備わっているそれがWSH(Windows Script Host)です。
また、ここではWSHだけに限らずWMI、ADSIなどのネタもOKです。
・煽りや荒らしは無視の方針で。基本的にsage進行です。
・ここでヒントを得て完成したスクリプトは、出来れば皆さんにお披露目してください。
同じことで悩んでいる人のためになります。
・質問する際は、OS及び使用するコンポーネントのバージョンもお忘れなく。
前スレ
お前ら、wsh使ってますか? Part7
http://hibari.2ch.net/test/read.cgi/win/1190548945/ おいぽまいら教えろ下さい、dotnetのライブラリを叩く際にだね
これは動かない
var random = new ActiveXObject("System.Random");
random.Next(1, 10);
これは動く
var random = new ActiveXObject("System.Random");
random.Next_2(1, 10);
上が動かないのは分かる、型宣言が出来ないからだ
じゃあ下は何故動くんだ、この_2は何を意味するの ああ何となく事故解決した、オーバーロードなんて仕様ないからケツに数字付けて区別するのか
型宣言とか全く関係なかった、数字の振り方の規則性がこれまたよく分からんがトライアンドエラーしかないのか
ちなみにSystem.Randomだとこうなるみたい
Next()→Next()
Next(Int32)→Next_3(Int32)
Next(Int32, Int32)→Next_2(Int32, Int32) すみません、全くの素人です。
アプリのアプリケーションキーの「(T)」を出力するだけのファイルを作りたいです。
どう書いたらいいですか。 自己解決
Set objShell = WScript.CreateObject("WScript.Shell")
WScript.Sleep 50
objShell.SendKeys "%(T)" vbsを使って社内システムへの自動ログイン処理をしたいと思っています。
yahooへは問題なくidpassを入れてログインできるのですが、社内システムの場合はエラーが表示されidpassも表示されません。
"エラーを特定できません"のエラーが表示されます。
どうも信頼済みサイトに登録されていることが原因というようなwebの記載を見つけました。
この場合は回避策はないのでしょうか。 クリップボードを加工する処理を書いています
内部はユニコードなので
SJISの範囲を越えた文字がクリップボードに入っていることがあります
それをEchoで表示させてみたりしても普通に表示されますし
文字列の結合をしても特に問題ないようです
しかしソースコードがSJISなので、
その文字に関する処理をソースコードの中に書けません
こういう場合どうするのがいいでしょうか?
クリップボードへのアクセスをUTF-8に出来たら
コードもUTF-8に出来るのですが、この処理はSJIS決め打ちですよね? >>900
案1:スクリプトをunicodeで書く。
案2JScript:SJISに無い文字は String.fromCharCode(code1, code2, ...) を使う。
案3VBScript:SJISに無い文字は ChrW(code) を使う。 >>901
ありがとうございます
案2で行きました // 以下のような例で * が消えてしまうのはなぜでしょうか? バグ?
var FS = WScript.CreateObject('Scripting.FileSystemObject');
WScript.Echo(FS.GetAbsolutePathName('C:\\Windo*'));// → C:\Windo*
WScript.Echo(FS.GetAbsolutePathName('C:\\Window*'));// → C:\Windows …なぜ?
WScript.Echo(FS.GetAbsolutePathName('C:\\Windows*'));// → C:\Windows* *が1文字のワイルドカードとして使えるということかね。 2016/9/1 jscript.dll がwindows updateされたせいで
今までいけていた win7/32bit(@職場)/wsh(jscript)で
エラーが多発するのは俺だけ? そうですよね。失礼しました。
こちらも、職場でのエラーメッセージまで覚えていないので
解決はあきらめて、情報をカキコだけしますが。
エクセルでInputBoxを使うやつで、
変数のvar 宣言が厳密?になったような印象で
動くやつとエラーで動かないやつとInputBoxが出ないパターンあるような。
var objXL = WScript.CreateObject("Excel.Application");
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var f = fs.GetFolder("\\\\file01\\○○課\\....\\Afoldername");
var folderlist = "";
//すべてのサブフォルダ
var subfc = new Enumerator(f.SubFolders);
for(; !subfc.atEnd(); subfc.moveNext())
if ( ((subfc.item().Name+"").indexOf("e"))==-1 ) folderlist += subfc.item().Name + "\r\n" ;
var strRet = objXL.InputBox(folderlist, "選択", "otamesi");
objXL.Quit();
のたぐいのやつです。
こんなことがあったということで。 Windows7にて、管理者権限(High)で起動しているプログラムから、
別のプログラムを標準ユーザー権限(Medium)で実行する方法はないでしょうか?
具体的には、
管理者権限で常駐しているAutoHotkeyから、
標準ユーザー権限でWSHスクリプトを起動したいと考えています。
管理者昇格で実行する方法は検索すれば出てくるのですか、
その逆は見つからなくて・・・
ログオンスクリプトから実行されたプログラムも
全部管理者権限になってしまいます。
これも解決したいと思っています。 「管理者として実行」されたコマンドラインから、「標準ユーザとして実行」する。
ttp://scripting.cocolog-nifty.com/blog/2010/01/post-5259.html >>912
ありがとうございます!まさにこれです。
しかしタスクから実行とは・・・
やっぱり降格実行って、すんなりには出来ないんですね
>>911
それは多分、ShellExecuteを使った昇格(Middle→High)のやり方だと。
WSHでは、Runでも、Execでも、ShellExecute でも
降格で実行する方法はありませんでした(探せませんでした) >>913
> >>911
> それは多分、ShellExecuteを使った昇格(Middle→High)のやり方だと。
コマンドラインのことじゃないの?
試したことないから実際できるかは知らないけど CreateObject("Shell.Application").ShellExecute("hoge.exe", "", "", "runasuser")
>>912と違ってユーザー名とパスワードを入力する必要があるのが面倒 >>915
> CreateObject("Shell.Application").ShellExecute("hoge.exe", "", "", "runasuser")
おお、runasuser という引数で可能だったのですね。
今まで知りませんでした。ありがとうございます。
確かにユーザとパスの入力にはリスクがありますし、配布には不向きですが、
場合によって使えそうです。 >>913
解決しているようですが、>>911 は RunAs.exe を使うことを意味していたつもりでした。 >>917
ありがとうございます。
runas.exeという存在も知りませんでした・・・。
確かにこの方法でも、/userをAdmin以外に指定すれば、
High→Mediumの降格は可能みたいですね!
でもやはり、userとpassまで入力するのがネックですね。
むしろこっちが当たり前で、912の方法はかなり特殊な方法でしょうか。 runasに/savecredオプションを付けるとパスワードが保存されるから
2回目以降はパスワードを入力しなくてよくなる
psexecってツールならユーザー名とパスワードをオプション引数で指定できるから毎回手打ちする必要は無くなる
https://technet.microsoft.com/ja-jp/sysinternals/bb897553.aspx
もちろんそれぞれデメリットもあるからご利用は計画的に えと、Windows7環境で質問です。
あるアプリが起動している間は、スリープに入らないって
設定ができるでしょうか?
ファイルメーカーなんですが、スリープしちゃうとネット
ワークが切れちゃって再起動しなくてはならないんで。 >>920
5分ごとにShiftを押す。じゃダメ?ctrl+Cで終了。
Set objShell = WScript.CreateObject("WScript.Shell")
Do
WScript.Sleep 1000*60*5
objShell.SendKeys "+"
Loop
メディアプレイヤーをずっと再生しておくっていう手もあるらしい。 超亀レスだがShiftじゃキー入力の妨げになるでしょ
マウスの空MOVEを定期的に送るのが常套手段
もろちんwshだけでやる方法はない /*
cscript.exe //nologo 特定プロセス実行中のスリープを抑止.js
副作用無しの SendKeys( Shiftの代わりにPRTSC(キャプチャ効果無し)を送ってもスリープを抑止できるようだ 先日何故か書き込みが途切れたので再書き込み
var exeName = "notepad.exe";
var interval = 60;
var oShell = WScript.CreateObject("WScript.Shell");
var objWMIService = GetObject("winmgmts://./root/cimv2");
while(true){
if(!new Enumerator(objWMIService.ExecQuery("select Name from Win32_Process where Name='" + exeName + "'")).atEnd())
oShell.SendKeys("{PRTSC}");
WScript.Sleep(1000 * interval);
}
WMIって面白い JScriptで再帰的なマッチを高速に行う方法ってありませんかね?
A(B(C(3),"a"),"$")
みたいな文字列を
({<3>,"a"},"$")
みたいにしたいです。Rubyみたいに再帰処理に対応した正規表現を
持っていれば対応する括弧をマッチさせることが出来ますが・・・ 2017.5.15に今どき、wshの本の改訂版が今ごろ出版されるとか。 >>886の件、
レジストリのCLSID(classid)を、登録した方から登録してない方へコピーするか、
wscファイルの中でCLSIDを指定しておけば、両方で使えた。
思うに、レジストリ上では、ProgID(COMコンポーネントID)は64/32bitで共通なのに対し、
CLSIDは64/32bitそれぞれで登録されているところ、
CLSIDはwsc登録時にランダムで生成されるため、
後から登録した方でProgIDのCLSID情報が異なる値で上書きされてしまい、
先に登録した方はProgIDから元々CLSIDにたどり着けなくなってしまった、
ということなのかなと。
なので、CLSIDが64/32bitで同じになるようにしてやればよいと。 関数呼び出し、ネスト2,3回位が限界なのかな。
変なところで戻ってくる。
使えない野郎だ、くっそマイクロソフトw 今更javascriptの学習兼ねてjscript勉強中
inputboxとmsgboxが64bit環境で呼び出せないのが割と辛いね
powershellだとC#埋め込んだりフォーム使い放題なんだよなー
↑スリープ抑止はC/C++/C#でさくっと空SendInput呼んだ方が楽だよ Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\Logs")
Wscript.Echo objFolder.Size
→これでC:\Logsのフォルダサイズが取得できるのに
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\Program Files")
Wscript.Echo objFolder.Size
→同じスクリプトでC:\Program Filesのサイズが取得できない
なぜなんだぜ? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) 管理者権限で実行しても "C:\Program Files\Windows NT" に含まれるジャンクションにアクセス失敗してエラーになるみたい 情報ありがとう
こちらでも昨夜というか今朝まで調べて
配下にリバースポイントが含まれるフォルダは
(普通の方法では)サイズの取得ができないとわかったよ
Program Files配下の全フォルダを抽出して
ひとつずつ再帰的にサイズ取得して合計するという案もあったけど
その中にはサイズが取得できないフォルダがあるから
合計したところで数値が合わないんだよね 仕方ないのでバッチファイルで
dir "C:\Program Files" /s /a-d | find "個のファイル" > hoge.txt
ってやって、ファイル末尾の1行を取得する事にしたわ
これだと一応、フォルダのプロパティで見たのと同じ値が取得できる
もはやスクリプトじゃなくなっちまったけども 重箱の隅をつつくようであれだが、リパースポイントな。リバースじゃなく。 wshで数万行クラスの巨大スクリプト書く人いるかな?
自分で使うちょっとした自動処理ならわずか数行〜数十行程度で済むが、他人にあげることを
想定したものならファイルパス等のハードコードは絶対に避けてコマンドライン引数やXML形式の
設定ファイルから指定させる等汎用性を高めたり、きちんとエラー対策をとったり等、れっきとした
「アプリ」として「開発」するため余裕で数千〜数万行に達してしまう。 自分で使う自動処理が拡張に拡張重ねて数万行クラスになったのはあるよ 数万行もあるスクリプトを貰っても持て余すなあ
もっと機能を絞って分割するなりして欲しいもんだ せいぜい数百から一千行程度に小分けしたスクリプト50本くらいを
ひとつのフォルダに入れて連携させてるよ
小分けしとくと色々使い回しがきいてラクだわ >>937
> 余裕で数千〜数万行に達してしまう
ScriptControlで動的にWSHのソースを読み込んで実行するタイプなら普通 特に、Classの継承機能のないVBScriptで無理やりオブジェクト指向な
コードを書こうとして、似たような構造のClassを作るため親Classを
コピペしてちょっと改造するって手法を繰り返してたら、
あっという間に数千行に達してしまう それはあるね。コピペ部分が結構多くて行数だけインフレしてる感じ 友達がWindowsで稼げている情報など。ニュースというか参考までに。
⇒ http://kuchibeta.sblo.jp/article/181868190.html
興味がある方のために書きました。
M60W6DP7X5 レス数が900を超えています。1000を超えると表示できなくなるよ。