■ このスレッドは過去ログ倉庫に格納されています
お前ら、wsh使ってますか? Part8
- 1 :名無し~3.EXE:2010/12/19(日) 22:20:35 ID:SZFqF39w.net
- こんなことコンピュータにやらせろよ。そう思ったことはありませんか?
簡易的な実行環境も含めて普通のOSだったら当たり前に備わっている自動実行。
Windowsの標準に備わっているそれがWSH(Windows Script Host)です。
また、ここではWSHだけに限らずWMI、ADSIなどのネタもOKです。
・煽りや荒らしは無視の方針で。基本的にsage進行です。
・ここでヒントを得て完成したスクリプトは、出来れば皆さんにお披露目してください。
同じことで悩んでいる人のためになります。
・質問する際は、OS及び使用するコンポーネントのバージョンもお忘れなく。
前スレ
お前ら、wsh使ってますか? Part7
http://hibari.2ch.net/test/read.cgi/win/1190548945/
- 597 :名無し~3.EXE:2014/03/10(月) 01:34:08.42 ID:odCUQACu.net
- wsh はハードウェアを直接たたけないので高レベルだが、何か?
- 598 :名無し~3.EXE:2014/03/18(火) 01:58:31.54 ID:8JSsnlcw.net
- Win7です
特定のフォルダ1つの中に、沢山のサブフォルダが100個単位であります
そことは違う場所に複数のファイルがあり、こいつらをさっきのサブフォルダにコピーや移動して整理したい
選択された個々のファイル名から、どのサブフォルダにコピー・移動すべきかはほぼ自動で決まります
ただ、沢山のサブフォルダ群から目的のサブフォルダを探し出すのが面倒なので、それを自動化したい
しかし、Win7のエクスプローラの操作感(上書き確認や別名でコピーなどの選択肢がサムネイルと日時付きで選べる)は
そのまま生かしたい
こういう場合にWSHは使えるでしょうか?
FileSystemObject の CopyFile を使うとデフォルトで上書きされてしまうようで、不都合です
他のオブジェクトのメソッドで、エクスプローラのあのダイアログを使えるようなものはないでしょうか?
- 599 :名無し~3.EXE:2014/03/18(火) 07:01:19.59 ID:7hnQmGRM.net
- これででるんだっけ?
ttp://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx
ttp://www.happy2-island.com/vbs/cafe02/capter00304.shtml
ttp://d.hatena.ne.jp/miya2000/20061211/1165806376
- 600 :名無し~3.EXE:2014/03/18(火) 17:59:54.71 ID:0kW9Tn2n.net
- >>599
おお!ありがとうございます!
さっそく試してみます
- 601 :名無し~3.EXE:2014/03/18(火) 20:34:54.00 ID:0kW9Tn2n.net
- >>599
フォルダまるごと、あるいは1個のファイルのコピーならば CopyHere が使えました
ありがとうございました
ただ、たとえばSendToにvbsファイルを登録して複数個のファイルのコピーをしようとすると
CopyHereの引数に複数ファイルを指定するやり方がググってみてもよく分からないため、
ループを回して1個ずつ個別にコピーしなければならず、
エクスプローラの「同じ処理を○個の競合に適用」が使えません
CopyHere に複数のファイルを渡すにはどうしたらよいのでしょうか?
- 602 :名無し~3.EXE:2014/03/18(火) 21:49:20.42 ID:0kW9Tn2n.net
- エクスプローラの「同じ処理を○個の競合に適用」が使えなくても
とりあえず使えればいいかな、と(テスト環境でなく)実際の環境で実践してみた結果・・・
「実行できません。引数一覧が長すぎます。」
Oh・・・こんな仕様があったとは・・・orz
- 603 :名無し~3.EXE:2014/03/19(水) 11:17:44.83 ID:sxeZPubB.net
- 事後報告
「送る」で多くのファイルをWSHに受け取るのは仕様上無理?っぽいので
結局WSHは諦めて、C#を使って↓のを参考に
クリップボードでファイルの受け渡し、コピー・移動は SHFileOperation を呼び出すことにしました・・・
ttp://uchukamen.com/Programming1/ToRecycleBin/
ttp://dobon.net/vb/dotnet/file/copyfiletoclipboard.html
- 604 :名無し~3.EXE:2014/03/19(水) 20:36:52.43 ID:WSz9wMSM.net
- プログラム初心者です。
しょうもない質問で申し訳ないのですが、ご教授願います。
定時にアラートを鳴らす下記のスクリプト、二回目のポップアップ以降
タスクバーに隠れてしまいます。
OKが押されるまでポップアップを出し続けるにはどうすればよいでしょうか?
OSはWindows7です。
よろしくお願いします。
strSoundFile="C:\Windows\Media\alert.wav"
Set objShell = CreateObject("Wscript.Shell")
Do While True
objShell.Run strSoundFile,0,True
If objShell.Popup("早く!", 3, "時間だよ", vbOKOnly) = 1 Then Exit Do
Loop
- 605 :名無し~3.EXE:2014/03/19(水) 20:45:51.46 ID:fmho9aI2.net
- 逆に考えるんだ
.popupって時間制限で消えるようにできるだろ?
戻り値が0にならない限り何度でも現れ直すようにすればいいだろ
- 606 :名無し~3.EXE:2014/03/19(水) 20:47:03.25 ID:fmho9aI2.net
- ってすまん
そういう風にしてるのか
だとすればサウンドを鳴らすだけのスクリプトを別に作っていちいち起動するようにするとかか?
- 607 :名無し~3.EXE:2014/03/19(水) 20:53:07.89 ID:WSz9wMSM.net
- >>606
ありがとうございます。
それしか方法はないのでしょうか・・・
XPでは全く同じスクリプトで繰り返しポップアップが出てたのに、7に移植すると
2回目以降が隠れてしまって困り果ててます。。
- 608 :名無し~3.EXE:2014/03/22(土) 23:52:20.61 ID:Z7dMfY4M.net
- If objShell.Popup("早く!", 3, "時間だよ", vbOKOnly+4096) = 1 Then Exit Do
- 609 :604:2014/03/23(日) 03:13:39.34 ID:Vw+/thwy.net
- >>608
ありがとうございます!
うまくいきました!
こちらに質問してよかったです。
お手数おかけしました。
- 610 :名無し~3.EXE:2014/03/23(日) 18:28:06.03 ID:IwD5u7Na.net
- >>608
PopupってMB_SYSTEMMODAL(4096)とかのメッセージボックス用フラグも効くのか!
てことは
MB_DEFBUTTON1(0)、MB_DEFBUTTON2(256)、
MB_DEFBUTTON3(512)、MB_DEFBUTTON4(768)、
MB_SYSTEMMODAL(4096)、MB_SETFOREGROUND(65536)、MB_TOPMOST(262144)、
MB_RIGHT(524288)、MB_RTLREADING(1048576)
このへんも使えるんだな。知らんかった
- 611 :名無し~3.EXE:2014/03/23(日) 20:31:45.36 ID:maZS4sl1.net
- >>610
MessageBox関数のパラメータは大体使えるよ
4 + 32 + 256とかでもちゃんと機能する
- 612 :名無し~3.EXE:2014/03/23(日) 20:59:53.06 ID:IwD5u7Na.net
- >>611
64以下のはMSDNとかにも記載があるけど他は…と思ったら
> natType の意味は、Microsoft Win32R アプリケーション プログラミング インターフェイスの MessageBox 関数で指定するものと同じです。
ちゃんとscript56.chmにも記載があったのね…見落としてたわ
- 613 :名無し~3.EXE:2014/03/27(木) 04:31:30.42 ID:2jCw5Ktt.net
- ScriptFormをダウンロードできるサイト知りませんか?
誰かアプロダにでも上げてもらえないでしょうか
- 614 :名無し~3.EXE:2014/03/28(金) 01:33:53.75 ID:61c3+d+I.net
- ググってもなんとか見つかるぞ
使い方:ttp://homepage2.nifty.com/pasocon/tanken/form.html
同梱してる事の確認:ttp://park15.wakwak.com/~ironrose/personalize.html
同梱してる物の入手:ttp://park15.wakwak.com/~ironrose/details.html
- 615 :名無し~3.EXE:2014/03/28(金) 02:15:59.95 ID:omqPRtXY.net
- >>614
助かったありがとう
同梱は盲点だった
- 616 :名無し~3.EXE:2014/03/31(月) 23:24:43.55 ID:cttL3XFr.net
- IE11でbusyとReadyStateがサポートされなくなったらしいですけどうすればいいですか?
よく使われてる以下のようなWaitLoad関数が駄目になって困ってます
環境はWin8.1、IE11です
- 617 :名無し~3.EXE:2014/03/31(月) 23:25:59.99 ID:cttL3XFr.net
- //グーグルとこのスレ繰り返し開くだけのJSスクリプトです。
//1回目のループは上手く行くのに2回目のグーグルを開いた時に止まってしまいます。
var IE = WScript.CreateObject("InternetExplorer.Application");
IE.Visible = true;
for(;;){//終了処理なしです
IE.Navigate("https://www.google.co.jp/");
WaitLoad();//2回目のここで止まる
IE.Navigate("http://toro.2ch.net/test/read.cgi/win/1292764835/");
WaitLoad();
}
function WaitLoad() {
var stat, dstart;
stat = 0;
while(true)
if(stat == 0) {
if(!IE.Busy)
if(IE.Document.readyState == "complete") {
dstart = (new Date()).getTime();
stat = 1;
}
}
else {
if(!IE.Busy &&
IE.Document.readyState == "complete") {
if((new Date()).getTime() >= dstart + 1000)//止まった時にブラウザを落とすとこの行でエラーになってる
break;
}
else
stat = 0;
}
}
- 618 :名無し~3.EXE:2014/04/01(火) 02:23:12.74 ID:QoieXD0A.net
- デバッグしろと?
- 619 :名無し~3.EXE:2014/04/01(火) 15:22:55.15 ID:KGWb56X2.net
- 下のはWin8.1、IE11の32/64bit両方で動いたよ
var IE = WScript.CreateObject('InternetExplorer.Application');
IE.Visible = true;
for (;;) {
IE.Navigate('https://www.google.co.jp/');
wait(IE);
IE.Navigate('http://toro.2ch.net/test/read.cgi/win/1292764835/');
wait(IE);
}
function wait(IE) {
WScript.Sleep(100);
while (IE.busy) WScript.Sleep(100);
while (IE.document.readyState !== 'complete') WScript.Sleep(100);
}
- 620 :名無し~3.EXE:2014/04/01(火) 20:20:02.45 ID:yNr0R4Jw.net
- >>619
ありがとうございます。動きました。使わせてもらいます。
ただWScript.Sleep(100);の部分が短すぎるので
1000にしたところ上記と同じように止まってしまうのが不可解です
あと記載を忘れてましたがOSとIE11はインストールしたばかりで設定をいじってません
IE11でbusyとReadyStateがサポートされてない件は他の方も困ってるみたいです
http://www.moug.net/faq/viewtopic.php?t=67866
http://www.moug.net/faq/viewtopic.php?t=67282
http://d.hatena.ne.jp/O_Kohsuke/20131103/1383476948
- 621 :名無し~3.EXE:2014/04/01(火) 21:10:26.71 ID:yNr0R4Jw.net
- もう一つ、上記サイトに言及のある拡張保護モードか、保護モードを無効にしても同じ所で止まります
- 622 :名無し~3.EXE:2014/04/01(火) 21:35:14.14 ID:2YVuc9Gt.net
- >>620
>IE11でbusyとReadyStateがサポートされてない件は他の方も困ってるみたいです
だって誰得?だもん
- 623 :名無し~3.EXE:2014/04/02(水) 03:59:22.30 ID:PW6w/sWY.net
- 使ってる奴が居る以上誰得って言い方で切り捨ては出来ねぇと思うけどなぁ…
- 624 :名無し~3.EXE:2014/04/08(火) 23:52:31.58 ID:D4TzPxaZ.net
- windows7に移行したら、XPで動いてたvbsがうまく動かない
具体的には
・msgboxが最前に出てこなくなった
・Appactivateの効きが悪い気がする
なんか対策ありませんでしょうか
- 625 :名無し~3.EXE:2014/04/09(水) 02:06:18.35 ID:IEtgoGKr.net
- >>624
前者については>>604と>>608>>610を参照すればいいと思う
後者は・・・泥臭すぎて微妙な対策だが、スリープ挟むとか、
スリープ挟んで複数回アクティブ化するとかで軽減できないか?
- 626 :名無し~3.EXE:2014/04/09(水) 21:42:25.69 ID:MDutfYCP.net
- ありがとうございます。なんかいろいろできるんですね
もう少し研究してみます
win7もIE9もキライ
- 627 :名無し~3.EXE:2014/04/10(木) 19:16:49.59 ID:gwTmemoR.net
- >>626
win8.1&IE11・・・
- 628 :名無し~3.EXE:2014/04/11(金) 06:18:12.18 ID:iUTXG8Bc.net
- まぁwsh窓際だからね・・・
- 629 :名無し~3.EXE:2014/04/19(土) 16:12:52.50 ID:qTxSEapj.net
- ブルーデーでググってみてごらん
- 630 :名無し~3.EXE:2014/04/19(土) 16:29:55.53 ID:C0hSChOr.net
- 普通の機動、または休止状態からの機動、またはスリープからの機動
にクスっときた
- 631 :名無し~3.EXE:2014/04/19(土) 17:12:47.57 ID:D/gd45tC.net
- WSH全然関係ないけどタスクスケジューラで
USBデバイスからの復帰をトリガーとして起動するタスクなんてものもあるけどな
- 632 :名無し~3.EXE:2014/04/28(月) 10:40:52.56 ID:DICVXVj1.net
- DOSバッチまたはWSHでメインフレームのSYSINデータセットみたいなことできませんか?
SYSINにVBScriptのソースを書いて、cscriptでそれを実行するとか、
SYSINにFTPのコマンドを書いて、FTP.exeに読ませるとか、
SYSINに適当な入力データを書いて、SYSINをtextファイルとして読み込むようなことをしたい。
SYSIN部分を別ファイルにすれば可能ですが、1個のファイルにしたくて。
ファイルのイメージ
---------- test.bat or test.vbs -------------
//SYSIN DD *
適当な入力データ
//
DOS/VBScriptのコマンドを書いてSYSINをtextファイルとして読み込む
---------- test.bat or test.vbs -------------
- 633 :名無し~3.EXE:2014/04/28(月) 13:00:04.87 ID:ev/jr+Zm.net
- >633
WSHなら WScript.StdIn を使えばいいと思う
- 634 :名無し~3.EXE:2014/04/29(火) 03:39:47.60 ID:8ypvRdMf.net
- >>632
意識しないでデータを読みこむのは無理だと思うので、データ部分はコメント扱いされて実行されないようにしといて、
データを読み込むプロシージャを作成すれば良いんじゃないかな
【例】 batの場合はデータ部分を読み飛ばして、for文でデータを読み込む
@goto :proc
//SYSIN DD *
適当な入力データ
//
:proc
@echo off
for /f "skip=2 tokens=*" %%i in (%~f0) do (
set data=%%i
if "%%i" equ "//" goto :eof
call :output
)
goto :eof
:output
echo %data%
goto :eof
【例2】 jscriptの場合
if (0)
//SYSIN DD *
適当な入力データ
//
@end
処理スクリプト
【例3】 vbscriptの場合
jscriptの@if、@endの替わりにif false then、end ifを使う
- 635 :名無し~3.EXE:2014/04/29(火) 13:38:55.32 ID:rabqrtPg.net
- >>632
何が欲しいのか今ひとつ分からんのだけど、
複数行に渡るような大きな文字列データを埋め込んどきたいってこと?
それならWSFでresource使う方法なんかもあるけど
- 636 :名無し~3.EXE:2014/04/29(火) 21:41:23.74 ID:+pl4bZp4.net
- >>633-636
Thanksです。
バッチとかスクリプトのファイルの中に、入力データを書きたかったのです。
数文字程度なら、バッチの環境変数で渡すて出来そうですが、
複数行の文章だとどうしても出来なくて。
昔仕事でやってたM/FのJCL文はそういうことができててよかったなあと。
resourceが一番自分の思ってるに近そうです。
- 637 :名無し~3.EXE:2014/04/29(火) 23:22:16.38 ID:gKZrgnV9.net
- JScriptだと(function(){/*〜〜〜〜*/}).toString();で楽にヒアドキュメントモドキができるんだけどね。
- 638 :名無し~3.EXE:2014/04/30(水) 00:23:31.00 ID:nvx7kMwT.net
- >>636
懐かしいな、パンチカードの山
- 639 :名無し~3.EXE:2014/05/17(土) 18:50:28.98 ID:ftkNQf89.net
- //SYSIN DD *
- 640 :名無し~3.EXE:2014/05/24(土) 10:06:34.87 ID:4leeigTu.net
- WSHで画面のバックライトを消す方法ってありますか?
その手のツールやWin32APIを叩ける処理系使えば
できるのですがWin標準機能で出来る方法があれば・・・
- 641 :名無し~3.EXE:2014/05/24(土) 10:23:35.39 ID:uPytOxyo.net
- >641
↓この1行でWindows標準のブランクスクリーンセーバーを起動できるけど、これじゃダメかな?
CreateObject("WScript.Shell").Run "C:\Windows\System32\scrnsave.scr"
- 642 :名無し~3.EXE:2014/05/29(木) 07:27:28.06 ID:8DqbD5RS.net
- スクリーンセイバーでは、画面は暗く出来てもバックライトは消えないでしょ
つまり、消費電力低下もバックライト寿命延長も望めない
「画面を暗く」とかではなく、わざわざ「バックライトを」と言ってるって事は、そういうのが目的だと思われ
- 643 :名無し~3.EXE:2014/05/29(木) 20:15:23.71 ID:mpz900sV.net
- ついでに細かいことを言うと、液晶モニタでは黒画面にすると
消費電力が増える場合がある。
ttp://www.itmedia.co.jp/pcuser/articles/1105/25/news001.html
ttp://www.excite.co.jp/News/bit/E1238429157129.html
- 644 :名無し~3.EXE:2014/07/03(木) 14:13:08.65 ID:puDVYchs.net
- wsh cscript ってみんな使っているの?
どうもとっつきにくい
原因の一つは、予約語の長ったらしさと別ワールド感にあるような気がする。
バッチでだめならrubyでやってしまうもんな
- 645 :名無し~3.EXE:2014/07/03(木) 15:15:13.58 ID:jNTLinbp.net
- WSHは事実上のWindows標準機能になって十数年経つし、
昔のWin95やWinNT4.0でも修正せず正常に実行できるものを手軽に作れる。
(それに対してバッチファイルはWin9x系とWinNT系での違いが特に大きいから、環境変数%OS%の値が
"NT"か空欄かで処理を分岐させなければならない場合が少なくない)
そういう点で他のスクリプト言語より随分とっつきやすいと思うが
- 646 :名無し~3.EXE:2014/07/04(金) 21:25:06.89 ID:noH+Nmwl.net
- どのWinでも動くメリットは大きい。会社のPCでも気軽に使えるし
でもバイナリファイルの扱いに難があるのはしばしば困る
あとこれはWSHに限ったことではないけどRubyと比べるとコードが
冗長化しやすい
- 647 :名無し~3.EXE:2014/07/04(金) 21:43:53.99 ID:t8oKZxzN.net
- バイナリファイルだって扱えないってわけじゃないし、それほど面倒lくさいってほどでもないと思う
- 648 :名無し~3.EXE:2014/07/04(金) 22:00:52.84 ID:noH+Nmwl.net
- ADODB.Streamはアンチウィルスソフトが騒ぐから使いにくい
- 649 :名無し~3.EXE:2014/07/05(土) 04:26:07.22 ID:X4/wk4Kp.net
- それは環境依存の問題だろw
環境依存の問題を、WSHの問題であるかのように言う奴はアフォ
全てのアンチウィルスソフトがADODB.Streamに反応するわけじゃないし
後から反応しないように設定できる場合も多いので
言ってしまえば「どのWinでも起きる問題じゃない」って話だ
- 650 :名無し~3.EXE:2014/07/05(土) 11:16:49.33 ID:WBZ3i3eR.net
- AviraがADODB.Streamの実行を阻止するらしいが、他にもある?
- 651 :名無し~3.EXE:2014/07/05(土) 16:43:05.03 ID:DkwampXl.net
- 自分にはアンチウィルスソフトに駆除される可能性があると判っているものを
配布することは出来ない。バイナリファイルを扱うコードに限ればどのWinでも
動くというメリットは存在しない
- 652 :名無し~3.EXE:2014/07/05(土) 19:00:31.79 ID:gjWeDij8.net
- WSH以外でインストール不要、テキスト配布可能、バイナリ操作可能、x86/x64環境対応、を満たすのは
.NET Frameworkに含まれるC#やJScript.NETコンパイラ使うバッチファイル位しか実用的な選択肢がない。
ADODB.Streamの利用だけでウィルス扱いするクソアンチウィルスなんて所詮その程度のゴミ。
ADODB.Streamを難読化してアンチウィルスの検出回避してるコードとか見たことあるけど、
適当に回避仕込んで後は「アンチウィルスに排除されたらそのゴミを恨め」とでも言っとけばいい。
バイナリ配布使用が何しようが、どーせ巻き込まれるときは巻き込まれて機能不全起こすんだし。
一々ソース生成してコンパイルしたりインタプリタのインストールを要求するよりはWSH使ったほうが楽。
//つか配布して使わせるって前提ではRubyはnode.jsにすら劣る気が…
- 653 :名無し~3.EXE:2014/07/05(土) 19:08:48.87 ID:WBZ3i3eR.net
- ウィルス対策ソフトでは大抵除外指定できるもんなんだがAviraはそういう機能ないのか?
もしあるならreadmeで除外指定の説明しとけば十分なんだけどね
- 654 :名無し~3.EXE:2014/07/06(日) 04:11:44.89 ID:wAzKXrbd.net
- Rubyコードを配布するならインタプリタを同梱すれば良いだけでは
インタプリタをインストールする必要はない。exerbみたいにPEに
パックするツールもあることだし。難点を挙げるとすればでかいこと
くらいか。PythonやJavaなんかでも似たような手法があるな
WSHは社内利用でアプリの持ち込みが難しいく、誤爆しないことが
確認できている場合なんかには使うな
- 655 :名無し~3.EXE:2014/07/06(日) 05:38:19.38 ID:EYy1DF2z.net
- インタプリタの同梱はライセンス的に面倒くさいが、
Rubyとか単体インタプリタが公式から落とせないんだよなぁ…
node.jsでさえ公式が配布してるnode.exeがあれば最低限は動くってのに。
PE化ツールはスクリプト言語としての利点が大きく減るので論外かな。
主観も入ってるがWindowsでツール作って配布したりするのにRubyは向いてなさすぎ。
つかなんでRuby押しな人がWSHスレに来てんだよ…スレチだろそんなん。
- 656 :名無し~3.EXE:2014/07/09(水) 16:44:30.12 ID:3YYdz9Xv.net
- AviraでADODB.Streamの実験をしてみた
結論として
var strm = new ActiveXObject("ADODB.Stream");
var adTypeBinary = 1;
var adSaveCreateOverWrite = 2;
この3行が全部存在したら弾かれる
実際に使うかどうかは関係なく、ADODB.Stream、adTypeBinary、adSaveCreateOverWriteの文字列が存在してたらアウト
(adTypeText、adSaveCreateNotExistは問題ない)
このうちどれか1つでも無くせば通る
strm.Type = 1;
と書けば通るなんて意味ない
こんなん何のプロテクトにもなってなくてちゃんと書こうとしている正常なスクリプトだけが被害を被るだけじゃん
あと、scanの除外の指定は簡単にできるのでそっちでファイルやフォルダを指定しとく手もある
- 657 :名無し~3.EXE:2014/07/09(水) 17:01:01.40 ID:5yPR9jH6.net
- strm[unescape(〜〜)]()でも通るのだろうし(専ブラ用のGetLog.wsfとかがコレ)、evalに詰めても多分通るだろうからな…
誤検出上等で作られた既存マルウェアとマッチするパターン定義なのだとしてもゴミすぎる。
まぁアンチウィルスが一般人を害するのなんて珍しい話じゃないけどな。
ノートンがリファラ削ってCSRF攻撃がより発生しやすくなった件もそうだけど、
アンチウィルスに対するフールプルーフも考慮しないと駄目になってしまったと……
- 658 :名無し~3.EXE:2014/08/20(水) 09:14:55.55 ID:ADfHX5a6.net
- (`_')
- 659 :名無し~3.EXE:2014/09/20(土) 14:51:17.97 ID:ud3uQdHI.net
- 保守
- 660 :名無し~3.EXE:2014/10/28(火) 21:45:29.92 ID:9qJ4E2Eu.net
- ExcelVBAスレからこちらに誘導されました。
Sub test()
Dim WSH, cmd, path, output As String
Set WSH = CreateObject("WScript.Shell")
path = """C:\Program Files\7-Zip\7z.exe"""
output = """C:\Program Files\7-Zip\output.txt"""
cmd = path & " > " & output
WSH.Run "%ComSpec% /c " & cmd
End Sub
プログラムをshell.runで実行して、結果をプログラムと同じ場所にをテキスト出力したいんですが
上記のプログラムですと、テキストすら作成されずエラーも出ません。
試しにcmdの中をコマンドプロンプトで実行すると上手くテキスト出力できました。
環境変数の中も問題ない事確認しました。
一体何が原因でどうすれば意図通りに出力できるでしょうか?
- 661 :名無し~3.EXE:2014/10/28(火) 22:09:20.36 ID:AujnRT7T.net
- http://msdn.microsoft.com/ja-jp/library/cc364356.aspx
- 662 :名無し~3.EXE:2014/10/28(火) 23:40:34.81 ID:9qJ4E2Eu.net
- execは出力が長いと切れてしまうのと
チカチカするのでなるべくRunで動作させたいです・・・。
- 663 :名無し~3.EXE:2014/10/29(水) 01:13:30.66 ID:Ixj57Vcb.net
- まさかとは思うけど、定義だけでtestをcallしてないってオチじゃないだろうな
- 664 :名無し~3.EXE:2014/10/29(水) 21:40:17.17 ID:ZMfncWTQ.net
- Sub test()
Dim WSH, exec, cmd, path, output, Result, Errorcatch As String
Set WSH = CreateObject("WScript.Shell")
path = """C:\Program Files\7-Zip\7z.exe"""
output = """C:\Program Files\7-Zip\output.txt"""
cmd = path & " > " & output
Set exec = WSH.exec("%ComSpec% /c " & cmd)
Do While exec.Status = 0
DoEvents
Loop
Result = exec.StdOut.ReadAll
Errorcatch = exec.StdErr.ReadAll
End Sub
試しにexecに書き換えてこれでエラーメッセージを拾うと
"'C:\Program' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。"
ある筈の引用符が認識されなくなってるようだけど
wshって引用符を2つ以上受け入れられない仕様なんでしょうかね?
何にしろexecを使って出力しか無いようですね。
- 665 :名無し~3.EXE:2014/10/30(木) 00:21:27.89 ID:LmFdMFLe.net
- runで””が展開されて、cmd.exeが””無し文字列渡されてるだけ
VBS以前の問題すな
----
path = """""C:\Program Files\7-Zip\7z.exe"""
output = """C:\Users\hoge\Desktop\output.txt"""""
- 666 :名無し~3.EXE:2014/11/26(水) 01:10:25.43 ID:Rp1N9SF8.net
- WSH(JScript)からUACの権限の昇格無しにvhdファイルを任意のドライブレターでマウント、アンマウントする方法ってあります?
diskpartを使うと起動時にUACの権限昇格のプロンプトが出てしまうので出来ればそれを避けたいです
さらにdiskpartだと任意のドライブレターにするのもちょっとめんどくさい・・・
マイコンピュータの管理からマウントするときは権限昇格のプロンプトが出ないのでマウント操作自体は権限昇格無しにできるはず・・・
- 667 :名無し~3.EXE:2014/11/26(水) 03:52:31.59 ID:n9fh4HuN.net
- >>666
WSH的な方法もあるとは思うけど、面倒くさいからWScript.ShellのSendKeysで。
- 668 :名無し~3.EXE:2014/11/27(木) 00:44:59.90 ID:jN417OkL.net
- 自身をrunasで実行するコードを書いてネットワークドライブにコピーして実行したら
WScript.exe「ファイルが見つかりません」
管理者で実行するとネットワークドライブにあるスクリプトを実行できないっぽい。なんつートラップ・・・orz
でもUNCパスなら実行できるっぽい。変換するのマンドクセ・・・
- 669 :名無し~3.EXE:2014/11/27(木) 18:51:51.05 ID:n1bzZURg.net
- >>668
ユーザが違うからファイル共有のログイン状態が引き継がれないんだろう。
WSHの問題じゃなくて純粋にそのファイルが管理者権限側から見えてない。
ネットワークドライブの割り当ても引き継がれないってのは知らなかったが…考えて見れば当然だな。
runas notepadからファイルを開くでマイコンピュータ見に行けば確認できる。
ネットワークドライブ上から実行せず、UNCパスの方から実行すれば普通に動くんじゃないかな。
ただ、ログインの必要なファイル共有の場合はどっちみちダメ。
自身をテンポラリに複製するしか無いのかなぁ…管理者以外での実行も想定するならAll Users。
- 670 :名無し~3.EXE:2014/12/01(月) 12:04:16.94 ID:vl7TWbzO.net
- おそらく今更な話だと思うけど調べてもよく分からないので教えて下さい
var document = new ActiveXObject("htmlfile")でquerySelectorが使えないのは何故なんでしょう
互換モードで動いてるのが悪いのかと思ってmetaタグでIE=edgeを食わせたりしましたがやっぱり動きません
実用的にはjQueryでいいんですが、動かない理由が気になって仕方ありません
- 671 :名無し~3.EXE:2014/12/02(火) 02:41:56.87 ID:uW4tGm5l.net
- new ActiveXObject("htmlfile")で得られるTridentエンジンそれ自体がMSIE7系統のものなんじゃないの?
アプリケーションとしてインストールされているIEと、コンポーネントとして動くIEは別だったりもする。
document.parentWindow.navigator.userAgentを見ればIE7の互換モードらしいことが分かる。
IE7ないしその互換状態のIEコンポーネントではquerySelectorは実装されて無いはず。
metaタグでIE=edgeを食わせるのに成功しててもその場合取得したdocumentとwindowは別物になるんじゃないかと。
そのうえwindow.location.hrefを書き換えてもdocumentはそのまま参照できる状態が続いてしまう。
オブジェクト作る時点で互換モードじゃないオブジェクト作る方法があれば出来そうな気がするけどよく分からん。
- 672 :名無し~3.EXE:2014/12/02(火) 20:10:44.38 ID:7F177ivT.net
- ありがとうございます何となく分かりました
htmlfileというオブジェクトの実体は25336920-03F9-11CF-8FD0-00AA00686F13ですが
その下位キーにMicrosoft.mshtml, Version=7.0.3300.0というのがありますね
IE9のmshtml.dllのversionは9.xのようですからIE7相当の物を叩いてるという認識で間違いないようです
原因がはっきりしてスカッとしました
- 673 :669:2014/12/02(火) 20:38:48.68 ID:zhlSz+62.net
- >>669
遅くなってスマン。レスありがとう
ドライブレターをUNCパスに変換するコードを書いて・・・っとやっていたんだけど
ふと管理者でもネットワークドライブをマウントしてしまえばいいんじゃね?と気が付いた
やってみたらいけそうな感じ
ネットワークドライブマウント用のスクリプトを改変するのが一番楽かも
- 674 :名無し~3.EXE:2014/12/07(日) 02:12:17.14 ID:AWYCy4y8.net
- ie9以降のJavascriptエンジン(chakra)を使う方法
tp://subtech.g.hatena.ne.jp/mayuki/20111216/1324015296
- 675 :名無し~3.EXE:2014/12/07(日) 02:16:11.14 ID:AWYCy4y8.net
- スクリプトのダブルクリックで起動させたいなら>44の方法で
- 676 :名無し~3.EXE:2014/12/07(日) 08:47:00.96 ID:addxdQLq.net
- >>674
wsh 5以降のバージョンアップ履歴がわからんので
だれもが興味ないと思われ。
便利な機能があったら使いたいが。
- 677 :HDI ◆hbVYHgubO6hK :2015/02/01(日) 05:00:21.01 ID:m75TbliY.net
- MS IMEのプロパティ(ローマ字入力か仮名入力か、キーアサインはMS式か
ATOK式かVJE式か、オートコレクトの対象は…、etc.)をログオン直後に
スクリプトで変更したいのですが、何かいい方法はありますか?
ネットカフェとか公共図書館のPCコーナーとかに入ったときにいちいち
初期状態から変更するのが面倒なので、ワンクリックで処理したいのです。
WSHで無理ならExcel VBAとかC++とかでも構いません。
適用したい対象としては、Windows XP以降・Office 2007以降のすべての
バージョンのMS製IMEが操作できればベストです。
逆に、MS以外の他社のIME、たとえばATOKとかGoogleとかは無視して可です。
デフォルトでMS以外のIMEだけが入っているということはまずないので。
var ime=new ActiveXObject("xxxx.xxxx"); から書き始めるんだろうなあ…とは
思うものの、マシンの中にどういうActiveXが入っているのか調べる方法を
知らない有様ですので、その点についても教えていただければ幸いです。
データがHKEY_CURRENT_USERにあることは確認していますが、これを読み込むのは
起動時のみのようで(起動後にレジストリエディタで書き換えても反映されない)、
起動のたびに設定がまっさらになるマシンでは、レジストリの書き換えでは
無理なように思います。
よろしくお願いします。
- 678 :名無し~3.EXE:2015/02/01(日) 05:18:01.88 ID:sAJdFoY4.net
- MS-IME
- 679 :名無し~3.EXE:2015/02/01(日) 06:07:20.52 ID:TR1gUJb7.net
- ATOK
- 680 :名無し~3.EXE:2015/02/01(日) 06:26:01.34 ID:QzUKWvpg.net
- 33歳
- 681 : 【豚】 :2015/02/01(日) 06:43:40.20 ID:8yntfalp.net
- (´・ω・`)
- 682 :名無し~3.EXE:2015/02/02(月) 18:39:34.28 ID:491TsZx9.net
- webとwshを覚え始めたころ、
両方とも、Jscript/Javascript が使えるので
スクリプトはそれだけ覚えればいいじゃん
ということにしたら、
wshのサンプルプログラムは、VBscriptが大半で、
もういいや、と思って、はや9年。
- 683 :名無し~3.EXE:2015/02/02(月) 19:00:51.19 ID:eK+w3KVO.net
- WSHはオワコンそれは間違いない、じゃあ何を使えば良いのかPowerShellかつーとこれはちょっと方向性が違う
MSもいい加減何か考えろよ、それとも後継は.netということなのか
- 684 :名無し~3.EXE:2015/02/04(水) 19:41:53.02 ID:7fmrLBIM.net
- >>683 気軽に書けるインタプリタ言語、という縛りをかけると、
WSHを機能拡張するしか道はないように思う。
UNIX屋さんがいまだに/bin/shとかMakefileとかで作業してるみたいに。
- 685 :名無し~3.EXE:2015/02/06(金) 22:57:46.78 ID:tKm5DJDG.net
- ちとおたずねしたい事があるでレスします。
ファイル名のリネームのひな型を作ってるのですが
Option Explicit
dim objFL,objFLD,rename
Set objFL = CreateObject("Scripting.FileSystemObject")
Set objFL = objFL.GetFolder("C:\temp")
Set objFLD = objFL.Files
rename = "150202.jpg"
objFLD.Item(rename).Name = "001.jpg"
上記で実行すると
「プロシージャの呼び出し、または引数が不正です。」
というエラーが出てしまいます。
下の部分を
objFLD.Item("150202.jpg").Name = "001.jpg"
に書換え
rename = "150202.jpg"
を削除すると
ファイル名が変更されました。
Itemプロパティの引数に変数は使えないのでしょうか?
- 686 :名無し~3.EXE:2015/02/07(土) 02:54:15.68 ID:m7VnhhKE.net
- >>685
VBSは使わないのでItemプロパティで変数が使えない理由は知らないが
なぜGetFileを使わないの?
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFILE = objFSO.GetFile("c:\temp" & "\" & rename)
objFILE.Name = "001.jpg"
でいいと思うけど
- 687 :名無し~3.EXE:2015/02/07(土) 04:39:30.38 ID:P9nBQ8IX.net
- >>686
知らなかったから……(恥)
まあ複数のファイルを扱いたかったのでFilesコレクションが
使えればと、ここでできなければ他の方法を探す予定でした。
近い形ができたので
Option Explicit
dim objFL,objFLD,objItem,i,l,objFiles(),objFSO,objFILE
Set objFL = CreateObject("Scripting.FileSystemObject")
Set objFL = objFL.GetFolder("C:\temp")
Set objFLD = objFL.Files
ReDim objFiles(objFLD.Count)
i = 1
For Each objItem In objFLD
Set objFiles(i) = objItem
i = i + 1
Next
l = i
i = 1
For i = 1 To l
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFILE = objFSO.GetFile(objFiles(i))
objFILE.Name = InputBox(objFiles(i)&"の名前を変更してください")
Next
これもエラーが出てますが土日は来れないと思いますのでひとまず。
- 688 :名無し~3.EXE:2015/02/07(土) 04:42:25.81 ID:P9nBQ8IX.net
- >>686
それとお礼を忘れてました(汗)
有難うございます。
- 689 :名無し~3.EXE:2015/02/07(土) 05:39:16.39 ID:FFJOkXv4.net
- WSH
- 690 :名無し~3.EXE:2015/02/07(土) 05:40:09.49 ID:wHuPUcI3.net
- >>685
もう解決しているようだけど…ちょっとみてみた
CStr()するとか文字列演算するとかするとエラーにならないね
JScriptで似たようなコードだと、そんな変換必要ないし不思議だね
- 691 :名無し~3.EXE:2015/02/07(土) 05:57:22.40 ID:NRS/nR0g.net
- VBS使わないなあ
- 692 :名無し~3.EXE:2015/02/07(土) 16:44:40.34 ID:m7VnhhKE.net
- >>687
回りくどいことしてるけど、単純に以下のようにしちゃダメなの?
Option Explicit
dim objFSO,objFLD,objFC,objFILE
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFLD= objFSO.GetFolder("c:\temp")
Set objFC = objFLD.Files
For Each objFILE In objFC
objFILE.Name = InputBox(objFILE.Path & "の名前を変更してください")
Next
- 693 :名無し~3.EXE:2015/02/08(日) 14:53:46.71 ID:3Sq3UJI6.net
- 基本的な部分はもっと単純に出来る
Dim objFSO,objFILE
Set objFSO = CreateObject("Scripting.FileSystemObject")
For Each objFILE In objFSO.GetFolder("c:\temp").Files
objFILE.Name = InputBox(objFILE.Path & "の名前を変更してください")
Next
使い回さないなら、フォルダオブジェクトもファイルコレクションも変数に取る必要はない
でも逆に複雑にというか例外処理を入れた方が良い部分があり
InputBoxの戻り値は、直接ファイルオブジェクトのNameプロパティに代入しないで
一度変数に取り、空の場合、元のファイル名と同じ場合、重複がある場合などの対策を取った方が良い
とにかく、「フォルダ内の全ファイル」って対象のリネーム作業は
途中でエラー出して強制終了すると、リネーム終ってるものも含めて最初からやり直しで
しかもリネーム終ってるものはそのままのファイル名にしたくても
NameプロパティにInputBoxの戻り値を直接代入している状態では、未入力でOKやEnter押せばエラーになり
キャンセルボタンを押してもエラーになり、同じ名前を入力してもエラーになりで収集が付かなくなる
別の回避策としては、リネームが終ったファイルはc:\tempからc:\temp\#renameに
ファイル名変更と同時に移動を行い、処理の最後でc:\temp\#rename内の全ファイルを
c:\tempに移動してc:\temp\#renameを削除するって手もある
これなら途中のエラーで強制終了しても、次に実行した時にエラーになったファイルから始められるし
途中で強制終了せずに最後まで正常実行されれば、移動したファイルも元に戻るし
作った一時待避用フォルダも残らないので、結果は全く変わらない
説明が長くなったが、ファイル名変更って取っ掛かりは簡単だけど、まともなものを作るのはそれだけ難しいってこった
他には、使用不可文字とか、ファイルがロックされてるとかもあり得るしね
因みに知ってるかもしれないが、MsgBoxのボタン指定でvbYesNoCancelを使うと、三択の処理分けが出来るので
戻り値がEmptyだったら「はい→スキップ」「いいえ→再入力」「キャンセル→処理全体を終了」とか
重複がある場合は「はい→自動連番化」「いいえ→再入力」「キャンセル→スキップ」とかの対策が出来る
- 694 :名無し~3.EXE:2015/02/09(月) 19:00:47.67 ID:dzFyHPM6.net
- ファイルの取り扱いで多摩にあるのがフルパス長すぎでエラーが返るとかもあるな
- 695 :名無し~3.EXE:2015/02/11(水) 01:35:35.01 ID:wKEalFGT.net
- 遅くなりまして済みませんようやく返事します。
>>690
CStr()はダメだった、文字列演算はやってない
JScriptは知識不足でできなかった申し訳ない。
>>692
思いつかなかっただけです(汗)
>>693
>NameプロパティにInputBoxの戻り値を直接代入している状態では、
>未入力でOKやEnter押せばエラーになり
>キャンセルボタンを押してもエラーになり、
>同じ名前を入力してもエラーになりで収集が付かなくなる
なんか例外処理を入れた方が良さそうだが、自分1人でファイル数も
2〜3個を毎週処理する形なので単純な方を選びます。
>MsgBoxのボタン指定でvbYesNoCancelを使うと、
>三択の処理分けが出来るので
知っておりません……(再汗)
リネームに追加部分をつけるので>>693がシンプルでいいが使い回しの点で
>>692のコードにするかもしれない、WSHを使おうと思ったのは省力化と
WHSの勉強を兼ねてなのだが省力化からはもう逸脱しているようだ(笑)
皆さんレスありがとうございました。
- 696 :名無し~3.EXE:2015/02/11(水) 01:50:33.27 ID:RhhN4UgP.net
- 個人で使うにしても
せめて、入力のスキップと途中での中断とリネーム後のエラーチェックとそのリトライかキャンセル
ぐらいは組み込んだらいいと思う
- 697 :名無し~3.EXE:2015/02/11(水) 05:24:33.23 ID:7mopOKOq.net
- >>695
うちの環境では
objFLD.Item(rename).Name = "001.jpg"
を
objFLD.Item(CStr(rename)).Name = "001.jpg"
もしくは
objFLD.Item(rename & "").Name = "001.jpg"
でエラーが出なくなったよ
(そもそも最初のがなぜエラーになるかわかんないけど)
総レス数 947
299 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver.24052200