みみ さん 2005年 07月 23日 16時 22分 52秒

ためしに
Set wshShell = WScript.CreateObject("WScript.Shell")
ans = wshShell.Run("fc.exe D:\1.txt D:\2.txt >> D:\3.txt 2>&1 ", 0 , true )
として実行してみました。
比較する二つのファイルに相違点がある場合は リターンコード0が返って来、相違点が無い場合はリターンコードが0のようです。
(相違点はテキストファイルには出力されない)


みみ さん 2005年 07月 23日 16時 12分 12秒

>ばんのしゃーによかばんたさんへ

お返事ありがとうございます。

>>Set wshShell = WScript.CreateObject("WScript.Shell")
>>ans = wshShell.Run("cmd.exe /C FC 1.txt 2.txt >> 3.txt 2>&1 ", 0 , true )

>>*ファイルのパスは省略してコピーしています。

>そこに問題があるのでは?
>空白を含むパス名を引用符で囲まず、文字列連結しているのでは?

ファイルをパスを省略してコピーしたのは、ただ文字列が長かったので
この掲示板にコピーする際に、省略した、という意味です。

ためしに↓
Set wshShell = WScript.CreateObject("WScript.Shell")
ans = wshShell.Run("cmd.exe /C FC D:\1.txt D:\2.txt >> D:\3.txt 2>&1 ", 0 , true )
やはり結果が出力されまん。

ばんのしゃーによかばんた さん 2005年 07月 22日 21時 15分 51秒

Runで非同期待ち合わせする方法の別案です。
Execを使わないので、WSH5.6でなくても、WSH2.0で動くかも。

RunAsynch.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit

Function GetHTA()
Dim ie
Dim Name
Dim wShell
Dim Shell

Name=Replace(WScript.ScriptName,".","_")
Set wShell=CreateObject("WScript.Shell")
wShell.Run "MSHTA.EXE ""javascript:open(""about:blank"","""&Name&""",""width=100,height=100"");'<hta:application border=none showintaskbar=no />'"""
Do While Not wShell.AppActivate("about:blank")
WScript.Sleep 100
Loop
Set Shell=CreateObject("Shell.Application")
Do While IsEmpty(ie)
 For Each ie In Shell.Windows
  If ie.ReadyState=4 Then
   If TypeName(ie.document)="HTMLDocument" Then
    If ie.document.parentWindow.name=Name Then
     If TypeName(ie.document.parentWindow.opener)="HTMLWindow2" Then
      ie.document.parentWindow.name=""
      Exit For
     End If
    End If
   End If
  End If
 Next
 WScript.Sleep 100
Loop
Set GetHTA=ie.document.parentWindow.opener
GetHTA.resizeTo 0,0
ie.Quit
End Function

Dim h1,h2

Set h1=GetHTA()
h1.status=""
Call h1.setTimeout("status=CreateObject(""WScript.Shell"").Run(""notepad.exe"",5,True)",10,"VBScript")

Set h2=GetHTA()
h2.status=""
Call h2.setTimeout("status=CreateObject(""WScript.Shell"").Run(""notepad.exe"",5,True)",10,"VBScript")

Do
 If IsEmpty(h1) And IsEmpty(h2) Then Exit Do
 If Not IsEmpty(h1) Then
  If h1.status<>"" Then 
   MsgBox "h1"&vbLf& h1.status
   h1.close
   h1=Empty
  End If
 End If
 If Not IsEmpty(h2) Then
  If h2.status<>"" Then 
   MsgBox "h2"&vbLf& h2.status
   h2.close
   h2=Empty
  End If
 End If
 WScript.Sleep 100
Loop
――――――――――――――――――――――――――――――――――――――

ばんのしゃーによかばんた さん 2005年 07月 22日 21時 15分 35秒

>ちゃっぴ さん 2005年 07月 21日 21時 53分 16秒
>Network越しに設定するのではいけませんか?

つまり、管理者が、ってことでしょうか?

クライアントが新たに加わろうとしたとき、管理者の手を煩わせることなく、
何かファイルを取り込んで実行するだけ、みたいなのが求められているのでしょう。
きっと。

クライアント側で何かをキックするとサーバ側でSCHTASKSが動いて
クライアント環境に設定するみたいな仕組みにするとか。

それだったら、クライアント側で何かをキックすると、サーバ側でそのユーザを
何か専用のグループに追加して、その権限で使えるようにしてやればよいような。

いずれにせよ、仕掛けがちょっと大掛かりになりそう。
その辺がネックで、例の簡便で危ない方法へ流れるのではないでしょうか。

一般的なニーズのようなので、安全でしかも簡便な、定番のソリューション
パターンが、その辺に転がってそうなものですが。


ばんのしゃーによかばんた さん 2005年 07月 22日 21時 15分 17秒

>ばんのしゃーによかばんた さん 2005年 07月 22日 20時 23分 39秒

訂正。

> n>&m

m>&n



>みみ さん 2005年 07月 22日 15時 25分 01秒
>おつかれさまです。

あれ、久し振りに聞きました。
島根や富山の方が電話でよく使われましたね。
この挨拶、返答にちょっと困るんですよね。
残業時ならまだしも、朝一番の電話ではちょっと違和感を覚えました。
なんで知ってるの? or そんな訳ないだろ! なんて。

>Set wshShell = WScript.CreateObject("WScript.Shell")
>ans = wshShell.Run("cmd.exe /C FC 1.txt 2.txt >> 3.txt 2>&1 ", 0 , true )

>*ファイルのパスは省略してコピーしています。

そこに問題があるのでは?
空白を含むパス名を引用符で囲まず、文字列連結しているのでは?


ばんのしゃーによかばんた さん 2005年 07月 22日 20時 23分 55秒

>ばんのしゃーによかばんた さん 2005年 07月 21日 15時 52分 08秒
>Exec.WSF

訂正。

>Call CreateObject("WScript.Shell").Run("CMD.EXE /C WScript.EXE """&WScript.ScriptFullName&""" //Job:StdIn """&pStdIn&""" | """&Command&""" 1>"""&pStdOut&""" 2>"""&pStdErr&"""",0,False)

Call CreateObject("WScript.Shell").Run("CMD.EXE /C WScript.EXE """&WScript.ScriptFullName&""" //Job:StdIn """&pStdIn&""" | "&Command&" 1>"""&pStdOut&""" 2>"""&pStdErr&"""",0,False)

>If AtEndOfStream(WScript.ScriptFullName&".StdOut") And AtEndOfStream(WScript.ScriptFullName&".StdErr") And StdOut.AtEndOfStream And StdErr.AtEndOfStream Then Exit Do

If AtEndOfStream(pStdOut) And AtEndOfStream(pStdErr) And StdOut.AtEndOfStream And StdErr.AtEndOfStream Then Exit Do



ばんのしゃーによかばんた さん 2005年 07月 22日 20時 23分 39秒

>ちゃっぴ さん 2005年 07月 13日 12時 49分 53秒
>To のぽぽん さん 2005年 07月 13日 10時 52分 11秒
>> tasklist /S ("PC名称") /FI "imagename eq ("検索文字列") >&2 ("ログ")
>Windows の help で Redirector の使い方勉強しましょう。
>tasklist /S ("PC名称") /FI "imagename eq ("検索文字列") > ("ログ") 2>&1

このシンタクスは、shellの作りを知らないと、嵌ります。

n>file

close(n);
open(file);     空いているfd(=n)に割り当て。

n>&m

close(m)
dup2(n,m)     m以上の最初のfd(=m)に割り当て。

なので、

>file 2>&1
は、前から順に処理して、

close(1)
open(file)     1はfile。
close(2)
dup(1,2)     2もfile。

でよいけれど、

2>&1 >file
は、

close(2)
dup(1,2)     2は標準出力と同じに。
close(1)
open(file)     1はファイルへ。

標準エラーは元の標準出力つまりコンソールになっちゃいます。

こういう説明は、ヘルプに書いてないと思います。

しかし、この仕様の記憶術(mnemonic)は何かないものでしょうか。
分からなくなる度にソースを思い浮かべるのは何とも不便です。


ばんのしゃーによかばんた さん 2005年 07月 22日 20時 23分 19秒

さて、ドロップ時のカレントディレクトリの変更方法です。
下記のHTMファイルを「お気に入り」に登録し、
「エクスプローラ」で「お気に入り」から開きます。
「IE」から開いたのでは駄目です。プロセスが異なる。

ChangeDirectory.HTM
――――――――――――――――――――――――――――――――――――――
<html>
<head>
<script language=vbscript>
Set wShell=CreateObject("WScript.Shell")
Sub window_onload()
CWD.Value=wShell.CurrentDirectory
End Sub
Sub ChangeDirectory()
wShell.CurrentDirectory=CWD.Value
CWD.Value=wShell.CurrentDirectory
End Sub
</script>
</head>
<body>
<input type=text id="CWD" size=100>
<input type=button value=change onclick=changedirectory>
</body>
</html>


ばんのしゃーによかばんた さん 2005年 07月 22日 20時 22分 56秒

>ばんのしゃーによかばんた さん 2005年 07月 10日 15時 44分 34秒
>>megu さん 2005年 07月 09日 20時 11分 12秒
>>ダウンロードコーナーにある[IEのお気に入りをHTML化]を実行しましたが、
>>done.と表示されて、ファイルが作成されませんでした。
>どうやって実行されました?
>カレントディレクトリが違うのでは?
>「お気に入り」や「リンク」から実行したのではありませんか?

その後、結果報告がないので、該当したのかどうか分かりませんが、
一般的なテーマでもあるので、話を続けます。

ファイルをドロップしたときの作業フォルダ や
「お気に入り」や「リンク」から起動したときの作業フォルダ は、
困ったことに「不定」です。きっと「仕様」なのでしょう。
しかし、ユーザフレンドリな良い「仕様」とは決して言えないでしょう。

本当は、エクスプローラプロセスの作業フォルダなのですが、
ユーザにとっては、「不定」みたいなものです。
予測できない「仕様」ほど悪い「仕様」はありません。

この「仕様」は是非とも、改善して欲しいものです。
ドラッグ元のファイル群のフォルダは複数有り得るので駄目ですが、
ドロップ先のファイルのフォルダならひとつなので、これにして欲しい。

「お気に入り」や「リンク」は、ショートカット(.LNK)なら大丈夫です。
プロパティで指定した作業フォルダになります。
※先の話がもし該当していたら、これで解決なんでしょう。

しかし、ドロップの方は、ショートカット(.LNK)でも駄目です。
これは、「障害」だと思います。
この「障害」は是非とも、修正して欲しいものです。

それまでの回避策ですが、スクリプトで作業フォルダを見ないようにする、
しかないでしょう。

スクリプトから、ドロップで起動されたかどうかが区別できれば、
普通は作業フォルダを見て、
ドロップのときはスクリプトファイルのフォルダ
のように、場合分けが出来ます。

例えば、関連付けに、//xxx:%Sを追加して、
スクリプトから、一般の引数とは別に、これが取り出せればよいのです。
%S
1 double click/start
5 drop

そこで、//T:100000%S としてやればどうでしょう?
WScript.Timeoutが1000001か1000005で区別できそうです。



みみ さん 2005年 07月 22日 15時 25分 01秒

おつかれさまです。

ご存知でしたら教えてください。
二つのファイルを比較して相違点を検出しとうよしています。

コマンドラインのFCコマンドを利用しようとしているのですが
下記のコードで戻り値が1となり、比較結果が出力されません。


Set wshShell = WScript.CreateObject("WScript.Shell")
ans = wshShell.Run("cmd.exe /C FC 1.txt 2.txt >> 3.txt 2>&1 ", 0 , true )

*ファイルのパスは省略してコピーしています。

よろしくお願いします。

ちゃっぴ さん 2005年 07月 21日 21時 53分 16秒

To ばんのしゃーによかばんた さん 2005年 07月 21日 15時 50分 43秒

>> ちゃっぴ さん 2005年 07月 15日 17時 10分 39秒
>> To
>>> で、この手順を安全に手軽に各マシンに配布する方法はあるのでしょうか?
>>XP以降であれば、例のSCHTASKSなんですがね〜。
>
> 具体的には、どんな風にするのでしょうか。
> SCHTASKSでタスクを登録するときにパスワードを指定して
> それをスクリプトに埋め込んだら、また堂々巡りになっちゃいます。

Network越しに設定するのではいけませんか?
# SCHTASKS.EXE では、RemoteからTaskを設定できます。
そもそも、こういった処理の用途を考えるとLAN内で使われる
端末というのが前提でしょうから

ばんのしゃーによかばんた さん 2005年 07月 21日 15時 52分 08秒

Execは、標準入出力が扱えて便利そうですが、ウィンドウが表示されて、鬱陶しい。
また、単純な入出力ならよいですが、ちょっと複雑だとハングします。
そこで、これらの問題を解決するExecです。

Exec.WSF
――――――――――――――――――――――――――――――――――――――
<package>
<job>
<script language=VBScript>
Option Explicit
Dim wShell
Dim fso
Dim StdIn
Dim StdOut
Dim StdErr
Dim TempPath
Dim pStdIn
Dim pStdOut
Dim pStdErr
Dim Command

Set fso=CreateObject("Scripting.FileSystemObject")
TempPath=fso.GetSpecialFolder(2).Path
pStdIn=fso.BuildPath(TempPath,fso.GetTempName())
pStdOut=fso.BuildPath(TempPath,fso.GetTempName())
pStdErr=fso.BuildPath(TempPath,fso.GetTempName())
Set StdIn=fso.CreateTextFile(pStdIn)
Set wShell=CreateObject("WScript.Shell")
Command="MORE"
Call CreateObject("WScript.Shell").Run("CMD.EXE /C WScript.EXE """&WScript.ScriptFullName&""" //Job:StdIn """&pStdIn&""" | """&Command&""" 1>"""&pStdOut&""" 2>"""&pStdErr&"""",0,False)
StdIn.WriteLine "a"
StdIn.WriteLine "b"
StdIn.WriteLine "c"
StdIn.Close
Do While Not fso.FileExists(pStdOut)
 WScript.Sleep 1000
Loop
Set StdOut=fso.OpenTextFile(pStdOut)
Do While Not fso.FileExists(pStdErr)
 WScript.Sleep 1000
Loop
Set StdErr=fso.OpenTextFile(pStdErr)
Do
 Do While Not StdOut.AtEndOfStream
  MsgBox StdOut.ReadLine
 Loop
 Do While Not StdErr.AtEndOfStream
  MsgBox StdErr.ReadLine
 Loop
 If AtEndOfStream(WScript.ScriptFullName&".StdOut") And AtEndOfStream(WScript.ScriptFullName&".StdErr") And StdOut.AtEndOfStream And StdErr.AtEndOfStream Then Exit Do
 WScript.Sleep 1000
Loop
StdOut.Close
StdErr.Close
fso.DeleteFile(pStdIn)
fso.DeleteFile(pStdOut)
fso.DeleteFile(pStdErr)

Function AtEndOfStream(Path)
On Error Resume Next
Call fso.OpenTextFile(Path,8)
AtEndOfStream=CBool(Err.Number=0)
End Function
</script>
</job>
<job id=StdIn>
<script language=VBScript>
Option Explicit
Dim fso
Dim pStdIn:pStdIn=WScript.Arguments.Item(0)
Dim StdIn
Dim StdOut
Set fso=CreateObject("Scripting.FileSystemObject")
Set StdIn=fso.OpenTextFile(pStdIn)
Set StdOut=fso.GetStandardStream(1)
Do
 Do While Not StdIn.AtEndOfStream
  StdOut.WriteLine StdIn.ReadLine
 Loop
 If AtEndOfStream(pStdIn) And StdIn.AtEndOfStream Then Exit Do
 WScript.Sleep 1000
Loop
StdIn.Close
StdOut.Close
Function AtEndOfStream(Path)
On Error Resume Next
Call fso.OpenTextFile(Path,8)
AtEndOfStream=CBool(Err.Number=0)
End Function
</script>
</job>
</package>
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 07月 21日 15時 51分 46秒

Runは、非同期突き放しか、同期待ち合わせだけで、非同期待ち合わせがありません。
WindowsアプリならExecに変えればよいのですが、
コンソールアプリは、Execに変えると、ウィンドウが出たりして鬱陶しい。
そこで、Runで非同期待ち合わせする方法です。

Run.WSF
――――――――――――――――――――――――――――――――――――――
<package>
<job>
<script language=VBScript>
Option Explicit
Dim wShell
Dim oExec,pExec
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("WScript.EXE """&WScript.ScriptFullName&""" //Job:Run")
oExec.StdIn.WriteLine "Notepad.exe"
Set pExec=wShell.Exec("WScript.EXE """&WScript.ScriptFullName&""" //Job:Run")
pExec.StdIn.WriteLine "Notepad.exe"
Do
 If oExec Is Nothing And pExec Is Nothing Then Exit Do
 If Not oExec Is Nothing Then
  If oExec.Status Then
   MsgBox oExec.ExitCode
   Set oExec=Nothing
  End If
 End If
 If Not pExec Is Nothing Then
  If pExec.Status Then
   MsgBox pExec.ExitCode
   Set pExec=Nothing
  End If
 End If
 WScript.Sleep 100
Loop
</script>
</job>
<job id=Run>
<script language=VBScript>
WScript.Quit CreateObject("WScript.Shell").Run(WScript.StdIn.ReadLine,,True)
</script>
</job>
</package>
――――――――――――――――――――――――――――――――――――――
※引数渡しにすると、引用符が消える「障害」のため、標準入力渡しに。


ばんのしゃーによかばんた さん 2005年 07月 21日 15時 51分 25秒

MsgBox絡みで、

「マウスのプロパティ」の「ポインタオプション」にある、
□ポインタを自動的に規定のボタン上に移動する(&U)
ですが、ボタンがひとつ(vbOkOnly)のときは効きません。
これは「障害」ですね。

回避策は、必要なくても、ボタンを増やす(vbOkCancel)、でしょうか。


ばんのしゃーによかばんた さん 2005年 07月 21日 15時 50分 43秒

>ちゃっぴ さん 2005年 07月 15日 17時 10分 39秒
>To
>> で、この手順を安全に手軽に各マシンに配布する方法はあるのでしょうか?
>XP以降であれば、例のSCHTASKSなんですがね〜。

具体的には、どんな風にするのでしょうか。
SCHTASKSでタスクを登録するときにパスワードを指定して
それをスクリプトに埋め込んだら、また堂々巡りになっちゃいます。


むー さん 2005年 07月 21日 15時 33分 29秒

To:管理人むたぐちさん
お返事ありがとうございます。

>NT系では使えない技のようです。
なるほど,こちらの環境はNTなので使えないはずですね(^^;
調べて頂いたようで,お手数をお掛けしました。
過去の記事を参照してみます。

>WScript.Echoでメッセージを表示させてやるのが
>一番簡単で使いやすいと思います。
実は,前回の書き込みの時に書き忘れてしまっていたんですが,
HTAの中で処理を実行しているのでWScriptのEchoやSleepが
使えない状態です。
でも,この方法は使いやすそうですね。他の部分で活用したいと
思います。

引き続きいろいろと試してみようと思います。ありがとうございました。

管理人むたぐち さん 2005年 07月 20日 17時 50分 44秒

To: むー さん

補足ですが、私の個人的見解では、cscript.exeで実行の上
WScript.Echoでメッセージを表示させてやるのが
一番簡単で使いやすいと思います。

管理人むたぐち さん 2005年 07月 20日 17時 38分 02秒

To: むー さん

> WSHを始めたばかりなのですが,Popupメソッドでボタンなしの
> メッセージを表示させる方法がうまく動いてくれず途方に暮れて
> おります。

こちらで確認したところ、Win98/MEではボタンなしダイアログが表示、
Win2000/XPでは何も表示されず、となりました。
NT系では使えない技のようです。

ただ、どちらにせよこのボタンなしダイアログは、表示が消えた後に
次のステートメントが実行されるので、処理中であることを示す用途には
使えないと思います。

処理中ダイアログを表示させる方法については
ばんのしゃーによかばんたさんがいろいろ研究されておられますので、
過去記事を当たってみてください。


To: 空港 さん

> Navigateを使わず、直接ダウンロードできる方法があるととても助かるのですが・・・。

wikiのFAQをご覧ください。

通りすがり。 さん 2005年 07月 20日 17時 00分 12秒

wshshell.Run("cmd.exe /c copy '+aaa+' C:\\images3.jpg");

コマンドプロンプトを呼び出して、COPYするんなら...
こんなカンジじゃないかな?

未テストです。

はてな さん 2005年 07月 20日 16時 49分 23秒

>document.write('<script type="text/javascript">\n');
>document.write('function exec(){\n');
>document.write('var wshshell=new ActiveXObject("WScript.Shell");\n');
>document.write('wshshell.Run("copy '+aaa+' C:\\images3.jpg");\n');
>document.write('}\n');
copyコマンドを使おうとしてるけど、そもそもIEのブラウザでDOSのコマンドは使えたっけ?

困ってます さん 2005年 07月 20日 16時 44分 00秒

皆さん。はじめまして。

ローカルで以下のようなHTMLとjavascriptを使って
jpgファイルのコピーをしようとしているのですが
うまくいきません・・・。
誰が知っている方がおりましたら
ご教授下さい。



<html>
<head>
</head>

<body>
<script type="text/javascript">
<!--
function func() {
var aaa = document.form1.filename.value;
 alert(aaa);
document.write('<HTML>\n');
document.write('<HEAD>\n');
document.write('</HEAD>\n');
document.write('<BODY>\n');
document.write('<TABLE>\n');
document.write('<form name="form1" onsubmit="func()">\n');
document.write('<TR>\n');
document.write('<TD>\n');
document.write('<INPUT TYPE="text" NAME="filename" VALUE='+aaa+'>\n');
document.write('</TD>\n');
document.write('</TR>\n');
document.write('<TR>\n');
document.write('<TD>\n');
document.write('<img src='+aaa+' alt="test" width=200 height=200>\n');
document.write('</TD>\n');
document.write('</TR>\n');
document.write('</form>\n');
document.write('<form name="form2" >\n');
document.write('<input type="button" value="copy"
onclick="exec()">\n');
document.write('</form>\n');
document.write('</TABLE>\n');
document.write('</BODY>\n');
document.write('</HTML>\n');
document.write('<script type="text/javascript">\n');
document.write('function exec(){\n');
document.write('var wshshell=new ActiveXObject("WScript.Shell");\n');
document.write('wshshell.Run("copy '+aaa+' C:\\images3.jpg");\n');
document.write('}\n');
document.write('</script>\n');
}
-->
</script>
<form name="form1" onsubmit="func()">
<input type="file" name="filename">
<br>
<input type="submit" value="OK">
</form>
</body>
</html>


空港 さん 2005年 07月 20日 15時 30分 14秒

はじめまして。お世話になります。
CreateObject("InternetExplorer.Application")でIEを操作して、
aspで生成されるファイル(pdfやxls)へのリンク「http://***.asp?**=**」に対してNavigateさせますと、ファイルのダウンロードダイアログが出てきます。
これをスクリプトで「開く・保存・キャンセル」の中から保存を選び、自動で保存を行いたいです。
SendKeyしか方法は無いでしょうか?
Navigateを使わず、直接ダウンロードできる方法があるととても助かるのですが・・・。
お知恵をお貸し下さい。

むー さん 2005年 07月 20日 10時 06分 12秒

はじめまして。いつも拝見させていただいてます。
WSHを始めたばかりなのですが,Popupメソッドでボタンなしの
メッセージを表示させる方法がうまく動いてくれず途方に暮れて
おります。
過去の記事も参考にしたのですが,エラーはなく表示がされません。
よろしければ,皆様のご意見をお聞きしたいのですが。。。
下記はその部分を抜粋したソースです。

Set WshShell=CreateObject("WScript.Shell")
WshShell.Popup "処理実行中....",10,"確認メッセージ",59
exCmmand = "perl .\****.pl"
WshShell.Run exCmmand,7,True

他のサイトで発見した「59」の設定に「7」というのもありましたが
試してみた所同様の結果になりました。
お手数をお掛けしてすみませんが,よろしくお願いします。

管理人むたぐち さん 2005年 07月 19日 19時 43分 58秒

To: SIGNAL9 さん

お返事ありがとうございます。
もし実現したらいいなってことで参考程度にしていただければ幸いです。
Doodle3の完成、首をながーくして、気長に待たせていただきます。

SIGNAL9 さん 2005年 07月 19日 18時 05分 57秒

>むたぐち様

>Doodle3の開発は順調でしょうか?

公私ともにイロイロありまして頓挫中です(泣)

>少し、というかかなり後出しの要望になってしまうのですが、
>VFW(Video For Windows)対応のソースから画像ファイルを
>取り出す機能を追加していただけないでしょうか?

VfWですか…作ったことないので…おまけにキャプチャデバイス
(カメラ)自体持ってないんでテストができない(^^;)
ちょっと調べてはみますが、いつになるやらまったくお約束でき
ない状態ですm(__)m

まーく さん 2005年 07月 19日 15時 29分 11秒

いつも拝見させていただいてます。

以前、SetPasswordで悩まれていたかがいらっしゃると思いますが、
私もちょっと手詰まり状態で、もしわかる方がいらっしゃったら
ご意見をお聞きしたいです。

以下のようなスクリプトを作成して、
ActiveDirectoryへパスワード変更をかけようとしています。

Function SetActiveDirectoryPwd(Par)

' OpenDSObjectのセキュリティパラメータ
' ADS_SECURE_AUTHENTICATION:
' ADS_USE_ENCRYPTION:
'      自コンピュータとドメイン間で受け渡される情報が
'     必ず暗号化されるようにしています
Const ADS_SECURE_AUTHENTICATION          = &H1
Const ADS_USE_ENCRYPTION          = &H2
Const ADS_USE_SSL               = &H2
Const ADS_READONLY_SERVER          = &H4
Const ADS_PROMPT_CREDENTIALS          = &H8
Const ADS_NO_AUTHENTICATION          = &H10
Const ADS_FAST_BIND               = &H20
Const ADS_USE_SIGNING               = &H40
Const ADS_USE_SEALING               = &H80
Const ADS_USE_DELEGATION          = &H100
Const ADS_SERVER_BIND               = &H200
Const ADS_AUTH_RESERVED               = &H80000000

Const ADS_ACETYPE_ACCESS_DENIED_OBJECT     = &H6
Const ADS_ACEFLAG_OBJECT_TYPE_PRESENT     = &H1
Const ADS_RIGHT_DS_CONTROL_ACCESS     = &H100
Const CHANGE_PASSWORD_GUID          = "{ab721a53-1e2f-11d0-9819-00aa0040529b}"


' OpenDSObjectセキュリティパラメータ
Dim DsSecureParam

Dim strPassword

' OpenDSObjectセキュリティパラメータの設定
DsSecureParam = ADS_SECURE_AUTHENTICATION

On Error Resume Next

' Active Directoryにバインドし、ユーザ情報を取得する
Set objUser = objDs.OpenDSObject("LDAP://" & "AD_HOST:AD_PORT" & _
     Par.Item("dn"), "AD_ADMINUSER", "AD_ADMINPWD", DsSecureParam)

MsgBox(Err)

If Err <> 0 Then

MsgBox("test1")

     uSetDelta Par.Item("dn"), (Err And &H7FFFFFFF), 1
     SetActiveDirectoryPwd = vbCrLf & "DN: " & Par.Item("dn") & vbCrLf & _
          "Information: OpenDSObject() ADSI Error Code (0x" & Hex(Err) & ")" & vbCrLf & _
          "Additional Info: " & Err.Description
     Exit Function
End If

' Active Directoryユーザアカウントのパスワードを設定する
strPassword = Par.Item("unicodePwd")

objUser.SetPassword(strPassword)

If Err <> 0 Then

     uSetDelta Par.Item("dn"), (Err And &H7FFFFFFF), 1
     SetActiveDirectoryPwd = vbCrLf & "DN: " & Par.Item("dn") & vbCrLf & _
          "Information: SetPassword() ADSI Error Code (0x" & Hex(Err) & ")" & vbCrLf & _
          "Additional Info: " & Err.Description
     objUser = Nothing
     Exit Function
End If

' パスワード変更禁止設定
Set objSD = objUser.Get("ntSecurityDescriptor")
If Err <> 0 Then
     uSetDelta Par.Item("dn"), (Err And &H7FFFFFFF), 1
     SetActiveDirectoryPwd = vbCrLf & "DN: " & Par.Item("dn") & vbCrLf & _
          "Information: Get() ADSI Error Code (0x" & Hex(Err) & ")" & vbCrLf & _
          "Additional Info: " & Err.Description
     objUser = Nothing
     Exit Function
End If

Set objDACL = objSD.DiscretionaryAcl

arrTrustees = array("nt authority\self", "EVERYONE")
For Each strTrustee in arrTrustees
     Set objACE = CreateObject("AccessControlEntry")
     objACE.Trustee = strTrustee
     objACE.AceFlags = 0
     objACE.AceType = ADS_ACETYPE_ACCESS_DENIED_OBJECT
     objACE.Flags = ADS_ACEFLAG_OBJECT_TYPE_PRESENT
     objACE.ObjectType = CHANGE_PASSWORD_GUID
     objACE.AccessMask = ADS_RIGHT_DS_CONTROL_ACCESS
     objDACL.AddAce objACE
     objACE = Nothing
Next

objSD.DiscretionaryAcl = objDACL
objUser.Put "nTSecurityDescriptor", objSD

' プロパティ更新処理のコミット
objUser.SetInfo

Set objSD = Nothing
Set objUser = Nothing

End Function

VBScriptを実行するマシンのローカルにADがあった場合、
パスワード変更はうまくいくのですが、
VBScriptを実行するマシンの外部にADがあった場合、
以下のようなエラーが発生します。

(VBScriptを実行するマシンは、ドメイン認証有り無し両方で
 試しましたが、結果は同じでした。)

ADSI Error (0x8007007B) LDAP_INVALID_SYNTAX

どうも、SetPasswordでなんらかのエラーは返しているようなのですが、
手詰まってしまっています。


ぜひ、わかる方がおられれば、ご教示願えないでしょうか?

みみ さん 2005年 07月 19日 11時 20分 32秒

>管理人むたぐちさんへ

お返事ありがとうございます。IsDate関数は年・月・日にしか対応していないと思っていました。
教えていただいたコードを参考にさせていただきます。ありがとうございました。

管理人むたぐち さん 2005年 07月 19日 01時 46分 20秒

To: みみ さん

> "HHMMSS"形式で入力された数字が時間として正しいかどうかを判定する
> 関数を探しています。

こんなのはいかがでしょうか。

Function IsHHMMSS(ByVal str)
     If Len(str) = 6 Then
          str = Mid(str,1,2) & ":" & Mid(str,3,2) & ":" & Mid(str,5,2)
          IsHHMMSS = IsDate(str)
     Else
          IsHHMMSS = False
     End If
End Function

IsDate関数は、日付だけじゃなくて時刻の正当性もちゃんと判断してくれます。
ただし、HHMMSS形式には対応してないので、無理やりHH:MM:SSにしてから
IsDate関数に値を渡してやればいいでしょう。

管理人むたぐち さん 2005年 07月 19日 01時 35分 07秒

SIGNAL9さんへ。
(ごらんになっているかどうか分かりませんが…)

Doodle2をいつも愛用させていただいてます。ありがとうございます。
Doodle3の開発は順調でしょうか?
少し、というかかなり後出しの要望になってしまうのですが、
VFW(Video For Windows)対応のソースから画像ファイルを
取り出す機能を追加していただけないでしょうか?

というのも、私、趣味で個人的なWebサーバーを動かしていて、
WSHでいろいろ機能を追加しているんですけど、
「Webカメラから画像を取り込み画像ファイル化するだけ」
のユーティリティがどうしても見つからなかったんです。
(見つかったのは常駐するものばかり)

そこで、Doodle3ではWebカメラの取り込みを新機能として
追加していただければ夢がかなうなあ、と思った次第です。

定点カメラの画像を定期的に取得して、タイムスタンプを
画像に書き込み(これはDoodleが得意とする分野ですね)、
保存する、なんて、結構ニーズがあるんじゃないでしょうか?

ぜひ、検討いただけると幸いです。


みみ さん 2005年 07月 18日 20時 01分 26秒

続いて書き込み失礼します。

"HHMMSS"形式で入力された数字が時間として正しいかどうかを判定する
関数を探しています。
年・月・日形式のものなら 時間として正しいかどうかを判定する関数は見つけたのですが、時・分・秒を判定するちょうど良いものが見つかりません。
正規表現をつかって 各時・分・秒が0-12, 0-60,0-60内であるかどうかを
判定しようかと思っているのですがよい方法をご存知でしたら教えてください。お願いします。

みみ さん 2005年 07月 18日 13時 46分 32秒

管理人むたぐちさんへ

お返事ありがとうございます。

どうやら処理対象端末でリモートレジストリサービスが停止していたのが
原因らしいです。開始するとイベントログを取得することができました。
ありがとうございます。

せい さん 2005年 07月 17日 02時 36分 46秒

>>せい さん 2005年 07月 17日 02時 15分 09秒

…また*3やっちまった。以下の部分を変更してください。

変更個所(c11,c12とc21の文字列長が違う)
'vvv
Const c11="this is  same as c11"
Const c12="this is  same as c11" ' c11と同じ内容
Const c21="this isn't same as c11"
'^^^

変更内容(c11,c12とc21の文字列長を同じにした)
'vvv
Const c11="this is same as c11"
Const c12="this is same as c11" ' c11と同じ内容
Const c21="I'm not same as c11"
'^^^

せい さん 2005年 07月 17日 02時 15分 09秒

歯が落ち着いてきたのでおもろいことをします(インタープリターならどれも一緒かも)。
これをこねくりまわすとVARIANT型の書き換えなども出来ます。意味は…


Const c11="this is  same as c11"
Const c12="this is  same as c11" ' c11と同じ内容
Const c21="this isn't same as c11"

Dim dw
Set dw=CreateObject("DynamicWrapper")
dw.Register "kernel32.dll","RtlMoveMemory","f=s","i=wwl","r=l"

MsgBox "c11:" & c11
MsgBox "c12:" & c12
MsgBox "c21:" & c21
dw.RtlMoveMemory c11, c21, (Len(c21)+1)*2
MsgBox "c11:" & c11 ' c21と同じ内容になります
MsgBox "c12:" & c12 ' c11と同じ内容になります
MsgBox "c21:" & c21

ちゃっぴ さん 2005年 07月 17日 01時 32分 12秒

To 管理人むたぐち さん 2005年 07月 17日 00時 24分 13秒

あと、WMIで File Path を扱うと結構面倒なことが
発生することがあります。

詳しくは、さかもと さん 2005年 01月 12日 10時 47分 29秒
ということで・・・

ちゃっぴ さん 2005年 07月 17日 01時 21分 35秒

To 管理人むたぐち さん 2005年 07月 17日 00時 24分 13秒

これやったことがあるんですが、ものすごく遅くなるんですよね。
多分、FileSystemObject以上。
# ちなみに、LogParserのObjectを使用しても、かなり遅いです。
# FindFirstFile API Function の速度に慣れているせいも
# あるかと思いますが・・・

Likeは確かに便利ですが、それ以上に配列を返してくれるPropertyに
たいするQuery 構文が欲しいんですが・・・
# ADSIについても同じことが言えます。

> 一足早い夏休み気分。

いいな夏休み・・・

管理人むたぐち さん 2005年 07月 17日 00時 32分 06秒

To: みみ さん

ちょっとGoogleしてみたらこんなページが見つかりました。
http://www.microsoft.com/resources/documentation/WindowsServ/2003/standard/proddocs/ja-jp/Default.asp?url=/resources/documentation/WindowsServ/2003/standard/proddocs/ja-jp/sag_EVtroubleshooting.asp

/auxsourceオプションというのがあるそうです。
こっちを試してはいかがでしょう。

管理人むたぐち さん 2005年 07月 17日 00時 24分 13秒
URL:http://www.microsoft.com/japan/technet/scriptcenter/topics/win2003/like.mspx

スクリプトセンターの新着記事で知ったのですが、
Windows XP/Server 2003のWMIでは、WQL文に
LIKE演算子が使えるんですね。
http://www.microsoft.com/japan/technet/scriptcenter/topics/win2003/like.mspx

これを利用してファイル名に「音頭」が含まれるmp3ファイルを
ピックアップして、WinAMP用のプレイリストを作る
スクリプトなんてどうですか?
一足早い夏休み気分。(ファイルがないとダメですけど)

Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
Set ts= Fs.CreateTextFile("音頭.m3u")
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
  ("Select * from CIM_DataFile " & _
  "where Drive='d:' AND Extension = 'mp3' AND FileName Like '%音頭%'")
For Each objFile in colFiles
  ts.WriteLine objFile.Name
Next
ts.Close
msgbox "done"

鬱陶しい再帰構文を使わずとも簡単にファイルが
検索できるので、他にもいろんな応用ができると思います。

みみ さん 2005年 07月 16日 20時 22分 55秒

いつもお世話になっております。

他端末のイベントログを表示したいのですが
ヘルプにあるとおり
eventvwr /computername = ("コンピュータ名称")
と実行しても表示できません。
*ローカルのイベントログが表示される。

いったいどうしてなのでしょうか、お願いします。
Win XP上で他のWin XPのイベントログを表示しようとしています。

ばんのしゃーによかばんた さん 2005年 07月 16日 16時 27分 27秒

>魔界の仮面弁士 さん 2005年 07月 06日 02時 11分 40秒
>JScriptやVBScriptやVBAのように、COMベースの言語であれば、使用した
>ActiveXオブジェクトは、null(VBSではNothing)の代入やスクリプトの終了後、
>即座に破棄されるのですが、.NET系の言語から呼び出した場合は、アプリが
>終了しても破棄されるとは限らず、メモリ上に残ってしまう事があります。

MSは「これは仕様です」なんて言ってますね。

「直すだけの技術力がないので、こんな仕様で御免なさい」とか言えば、
まだ可愛げがあるのに、これでは、潜在ユーザを失うだけですよ。

ProcessのTerminate()がよくない理由もこれですね。

ミッションクリティカルなシステムでは、資源回収(リソースパージ)が
とても重要です。なのでメインフレームやunixでは空間終了の内と外など
何段階も資源回収が走るのですが、Windowsは、資源回収が重要という認識が
ないようです。アプリ任せ。OSとしての資源管理が欠落しているようです。
そんなことではいつまで経っても個人用途OSの域から抜けられないですよ。>MS

この「仕様」は今後、社会システムや業務システムでトラブルの種になりそう。
その結果、SI/SE/提携会社等から改善圧力が掛かるのではないでしょうか。

日経バイト5月号で国産最大手コンピュータメーカF社の高信頼IAサーバ
PRIME QUEST 400シリーズの発表記事を興味深く読みました。
読むほどに、これは昔の無停止フォルトトレラントコンピュータSURE System 2000
の競争力のないパーツを置き換えたもの、つまり、CPUをSPARCからIA64に、
独自FT OSをWindows/Linuxに変えたものという印象を持ちました。
でも、ハードがいくら超高可用性を誇っても、その上で動くWindowsが
これでは、宝の持ち腐れになりませんかねぇ。未解放資源をクリアするために
定期的にリブートしてくださいなんてユーザに言ったら、1CPU機当たり
2K万円、nCPU機ん億円払った客は怒りますよ、普通。心配だなぁ。


管理人むたぐち さん 2005年 07月 15日 21時 25分 56秒

To: WSH初心者 さん

> 以下のようにRunメソッドにより起動はできるのですが、これですと
> アプリの終了タイミングがわかりません。(アプリ終了時に何か処理を
> 行いたいのです)

RunメソッドではなくExecメソッドをお使いください。
Execメソッドが返すWshScriptExecオブジェクトの
Statusプロパティを見れば、プロセスが実行中かどうかがわかります。
Statusが1を返すまで空ループを回せば良いでしょう。
詳しくはヘルプをご覧ください。まさにそのような例があります。



To: ミヤーニアス さん

> WSHが正確に動作しない環境(例:OS/IEverなど)
> を教えて下さい。

正確に動作しないというのはちょっと曖昧な表現ですね。
一部機能が動作しない環境、ということでよろしいでしょうか。

Windows XP/2003に最初からインストールされている
Windows Script 5.6に含まれるWSH ver.5.6が、
WSHの最新バージョンとなります。

Windows2000/MEにはWSH2.0、Windows98にはWSH1.0が
インストールされています。
いずれもIE6.0をインストールすることで
Windows Script 5.6/WSH ver.5.6がインストールされ、
Windows XPと同等の機能となります。

なお、Windows Script 5.6は単体でもインストールできます。
http://www.asia.microsoft.com/japan/msdn/scripting/から
ダウンロードサイトに行けます。

他にも呼び出すコンポーネントによってはOS/IEのバージョンに
依存するものもありますが、列挙しだすとキリがないので
ここではやめておきます。

ちゃっぴ さん 2005年 07月 15日 17時 10分 39秒

To

> で、この手順を安全に手軽に各マシンに配布する方法はあるのでしょうか?

XP以降であれば、例のSCHTASKSなんですがね〜。

ない場合には、Task Scheduler API を使用して
同等のものを作るしかないのかな?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/taskschd/taskschd/the_task_scheduler_api.asp

ばんのしゃーによかばんた さん 2005年 07月 15日 14時 55分 14秒

>管理人むたぐち さん 2005年 07月 13日 19時 23分 01秒
>To: ばんのしゃーによかばんた さん 2005年 07月 13日 18時 30分 15秒
>> スクリプトエンコードって日本語がスルーなんですね。常識でした?
>常識かと思ってました!

でも、ドキュメントには書いてないでしょう?
まさか、これが「仕様」ということはないでしょう。

一度、MSの正式見解を聞いてみたいものです。
もし、「仕様」だと言ったら、「恥を知れ」と言い返してやりましょう。

そう云えば、
CScript.EXE/WScript.EXEの引数で二重引用符"が消える振る舞いも、
明らかに「障害」だと思います。
Named/Unnamedみたいな機能追加なんかより、こっちの「障害」のほうを
とっとと直して欲しいものです。

※「仕様」というのは、コマンドラインで空白を含むパス名は二重引用符
で囲む、みたいに必然性なり、優位性を顧客に説明できるものを云うので
あって、仕様決定理由を胸を張って説明できないようなものは
恥ずかしくって「仕様」とは云えない。のが普通です。


ばんのしゃーによかばんた さん 2005年 07月 15日 14時 54分 45秒

>ちゃっぴ さん 2005年 07月 12日 23時 30分 27秒
>> Scriptからrunasコマンドを投入し、パスワードを自動入力させてたいと考えています。
>この手の質問は多いですが、ScriptにPasswordを埋め込むこと自体が
>Security Hole です。

では、EXEなら安心かと言えば、そうでもなく、
VBのように文字列がそのまま丸見えなんてこともありますからね。

なら、さらにEXEをPKLITEで解凍不可モードで圧縮すればどうでしょう。
デバッガでメモリに展開されたものを読めば同じか。

>KEN さん 2005年 07月 13日 09時 36分 32秒
>その通りですね。
>サンプルでは埋め込み型になっていますが、実際にはScriptを実行するVB.NETアプリからパラメタとして渡す予定です。また、VB.NETアプリでもパスワードをプログラム内に記述しないようにする予定です。(ややこしいので詳細は省略します)

仮に完全に秘匿できたとしても、SendKeyなどを使っていたら、
例えば、NotePad.EXEをRunAs.EXEにリネームしてメモ帳に誤送信させるとか。

>marino さん 2005年 06月 28日 10時 27分 26秒
>To: なな さん
>> 他端末の共有フォルダをネットワークドライブ接続したいのですが、どうしてもダイアログボックスが表示され、パスパスワードの入力が要求されます。 どなたか、パスワードを入力しなくても良い方法をご存知ないでしょうか。
>Set WSHNetwork = WScript.Createobject("WScript.Network")
>WSHNetwork.MapNetworkdrive "ドライブ名" , "共有名" , "プロファイルの更新フラグ{False , True}" , "UserName" , "UserPass" 

一時的に"WScript.Network"というWSCを作ってやれば。

このようにプログラムからパスワードを送出する構造はどうやっても駄目。

結局、

>なので、そういう手段はScript側で実施せずに、OSの機能を
>利用されることをお勧めします。
>具体的には TaskScheduler がありますので、そこに通常と異なる
>Accountで登録して実行するようにしてやればよいでしょう。

この方法以外にないのでしょうね。

で、この手順を安全に手軽に各マシンに配布する方法はあるのでしょうか?
TaskSchedulerから.JOBというファイルがコピーできますが、
それにはAccountが付いてこないようです。
SA.DATというファイルができるようですが、何だろう。


ミヤーニアス さん 2005年 07月 15日 12時 04分 23秒

こんにちわ。

WSHが正確に動作しない環境(例:OS/IEverなど)
を教えて下さい。

ばんのしゃーによかばんた さん 2005年 07月 14日 18時 35分 05秒

■日本語もエンコード、PerlScriptもエンコードする方法です。

Usage: Start EncodeScriptEx.VBS files...
――――――――――――――――――――――――――――――――――――――
Option Explicit

Dim fso
Dim Encoder
Dim arg
Dim File
Dim iPath
Dim iName
Dim FolderName
Dim BaseName
Dim ExtensionName
Dim Ext
Dim Language
Dim Source
Dim Code
Dim oName
Dim oPath
Dim BackUp
Dim k
Dim fName

Set fso=CreateObject("Scripting.FileSystemObject")
Set Encoder=CreateObject("Scripting.Encoder")

For Each arg In WScript.Arguments
 Set File=fso.GetFile(arg)
 iPath=File.Path
 iName=File.Name
 FolderName=fso.GetParentFolderName(iPath)
 BaseName=fso.GetBaseName(iName)
 ExtensionName=fso.GetExtensionName(iName)
 Source=fso.OpenTextFile(iPath).ReadAll()
 Select Case(LCase(ExtensionName))
 Case "vbs"
  Language="VBScript"
  Ext=".VBE"
  Code=Encoder.EncodeScriptFile(".VBS","Execute(UnEscape("""&Escape(Source)&""")):",0,Empty)
 Case "js"
  Language="JScript"
  Ext=".JSE"
  Code=Encoder.EncodeScriptFile(".JS","eval(unescape("""&Escape(Source)&"""));",0,Empty)
 Case "pls"
  Language="PerlScript"
  Ext=".VBE"
  Code=Encoder.EncodeScriptFile(".VBS","Set SC=CreateObject(""ScriptControl""):SC.Language="""&Language&""":SC.AllowUI=true:SC.TimeOut=-1:SC.AddObject ""WScript"",WScript,True:On Error Resume Next:SC.ExecuteStatement(UnEscape("""&Escape(Source)&""")):If Err Then WScript.Echo Join(Array(""Script:""&vbTab&WScript.ScriptFullname,""Number:""&vbTab&SC.Error.Number,""Description:""&vbTab&SC.Error.Description,""Source:""&vbTab&SC.Error.Source,""Text:""&vbTab&SC.Error.Text,""Line:""&vbTab&SC.Error.Line,""Column:""&vbTab&SC.Error.Column),vbLf)",0,Empty)
 Case Else
  Language=ExtensionName
  Ext="."&ExtensionName&".Encode"
  Code=Encoder.EncodeScriptFile(".JS","execScript(unescape("""&Escape(Source)&"""),"""&Language&""");",0,Empty)
 End Select
 Code=Replace(Code,vbNullChar,"")
 oName=BaseName&Ext
 oPath=fso.BuildPath(FolderName,oName)
 BackUp=""
 If fso.FileExists(oPath) Then
  Set File=fso.GetFile(oPath)
  For k=1000 To 1999
   fName=BaseName & "." & Right(k ,3)
   Call Rename(File,fName)
   If Err=0 Then
    Exit For
   ElseIf Err<>58 Then
    WScript.Echo Err.Number & " : " & Err.Description
    WSscript.Quit
   End If
  Next
  BackUp=vbLf & "BackUp" & vbTab & fName
 End If
 fso.CreateTextFile(oPath,False).Write Code
 WScript.Echo "Script Encoded." & vbLf _
       & "To" & vbTab & oName & vbLf _
       & "From" & vbTab & iName & Backup
Next
WScript.Quit

Sub Rename(File,Name)
On Error Resume Next
File.Name=Name
End Sub
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 07月 14日 18時 34分 43秒

>KEN さん 2005年 07月 12日 22時 25分 08秒
>Scriptからrunasコマンドを投入し、パスワードを自動入力させてたいと考えています。
>過去ログで解説されているように、runメソッドで実行した場合は成功するのですが、
>execメソッドで実行すると失敗します。

Execは標準入出力をリダイレクトします。

RunAsコマンドは、パスワードを確実に人間から入力させたくて、
標準入力/出力がコンソールでないとエラーにするのでしょう。

なので、Runを使いましょう。

>runasコマンドが失敗した時のエラーを拾いたくて、execメソッドを使用しています)

rc=wShell.Run("CMD.EXE /C RunAs.EXE ... 2>"""&file&"""",,True)
で標準エラーをリダイレクトすればよいでしょう。

このとき、

>のぽぽん さん 2005年 07月 13日 10時 52分 11秒
>tasklistの結果をテキストファイルに吐き出す処理は出来ていました。すみません。
>(*予想していたのと違うディレクトリに出来ていて・・・ 100以上もファイルが
>作成されていたので驚きました)

なんてことにならないよう、
ファイル名はカレントディレクトリに依存しないフルパスを与えましょう。

で、TaskList.EXEの方は、逆にExecのほうが簡単です。
それも、
Set oExec=wShell.Exec("CMD.EXE /C TaskList.EXE ... 2&>1")
text=oExec.StdOut.ReadAll()
がお勧めです。
が、ウィンドウが表示されるのがどうしても嫌なら、
rc=wShell.Run("CMD.EXE /C TaskList.EXE ... 2&>1 1>"""&file&"""",0,True)
rc=wShell.Run("CMD.EXE /C TaskList.EXE ... 2>"""&file2&""" 1>"""&file1&"""",0,True)
でフルパスを与えることですね。

>KEN さん 2005年 07月 13日 09時 36分 32秒
>定期的に実行されるような処理はこれで可能ですね。
>しかし、随時起動の必要があり、予めスケジュール出来る利用形態ではないのです。

>ちゃっぴ さん 2005年 07月 13日 11時 37分 37秒
>右クリックして「タスクの実行」で実行できます。

この方法も以下の過去記事を参照。

>ばんのしゃーによかばんた さん 2004年 12月 26日 16時 02分 15秒


のぽぽん さん 2005年 07月 14日 16時 06分 57秒

>ちゃっぴさん

教えていただいたコードで目的は実現できました。
スクリプトを実行する際のログオンユーザ名とパスワードが処理対象端末と
違っていたのが原因だったようです。

お世話になりました。

WSH初心者 さん 2005年 07月 13日 20時 22分 13秒

こんばんわ
最近WSHを使いだしたのですが少し困っています。
スクリプトによりAアプリからBアプリを起動する場合があります。
以下のようにRunメソッドにより起動はできるのですが、これですと
アプリの終了タイミングがわかりません。(アプリ終了時に何か処理を
行いたいのです)

Dim WSHShell

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "C:\WINDOWS\system32\notepad.exe C:\temp\test1.txt", 5, False
objShell.Run "C:\WINDOWS\system32\notepad.exe C:\temp\test2.txt", 5, False

少しアドバイスをいただけたらと思います。
よろしくお願いします。


管理人むたぐち さん 2005年 07月 13日 19時 23分 01秒

To: ちゃっぴ さん 2005年 07月 12日 23時 30分 27秒

> 最低限、ばんのしゃーによかばんた さん が書いている Sample のように
> 暗号化してやらなければならないでしょうが、それを行うのもScript
> でしたら、容易に解析されてしまうでしょう。

私はこのような案件に対して、パスワードをcryptで置換した文字列を
スクリプト上に埋め込むことで対処しています。
スクリプト中では、
If Crypt("入力された文字列") = "cryptされたパスワード" Then
のような判定文を入れます。これでスクリプトソースを見られても、
真のパスワードはわかりません。

使用しているのは、JavaScriptでUNIXのCRYPT関数を再現する
スクリプトです。↓
http://javascript.internet.com/passwords/unix-crypt(3)-encryption.html



To: ばんのしゃーによかばんた さん 2005年 07月 13日 18時 30分 15秒

> スクリプトエンコードって日本語がスルーなんですね。常識でした?

常識かと思ってました!
私は、URLエンコードをかけて日本語をアルファベットに置換して、
エンコーダでエンコードされるようにしたりしてます。

> vbscript.dllなどを見ると、スクリプトエンジンがエンコードを
> ゴリゴリ意識してるみたいですね。ということはやっぱり無理かな。

JSEのレジストリエントリのCLSIDを辿ると、結局はjscript.dllに
たどり着きました。VBEも同様です。
つまり、エンコードは言語レベルで実装されている機能みたいですね。

ばんのしゃーによかばんた さん 2005年 07月 13日 18時 30分 40秒

JScriptやVBScriptのヘルプで、正規表現の構文にところに
任意の1文字にマッチさせるには、[.\n]と書け、と書いてありますが、
これは効きません。「障害」ですね。
回避策は[\s\S]などです。こっちは効きます。


Return