126

同様の質問 ( Windows の起動時にバックグラウンドでバッチ ファイルを実行する) には既に回答していますが、今回はバッチを起動する必要があります。

  • 別のバッチから、
  • コンソール ウィンドウが表示されずに、
  • すべての引数が非表示のバッチに渡されます。

最初のバッチは、コンソール ウィンドウで実行されます。ただし、2 番目のバッチ (最初のバッチによって非同期的に起動されたもの) にもコンソール ウィンドウを表示したくありません。

私はまさにそれを行う VBScript スクリプトを思いつきました。他の人が参照できるようにスクリプトを回答として置きましたが、他のアイデアや解決策がある場合は、気軽に貢献してください。

注: Windows コマンド プロセッサのコンソール ウィンドウは、多くの人が正しくない DOS ウィンドウと呼んでいます。


回答ありがとうございます。私が理解していることから、スクリプトを非同期的に呼び出して非表示モードで実行する必要がある場合:

  • コンソール ウィンドウに既にある 2 番目のスクリプトstart /bで十分です。
  • Windows から、2 番目のウィンドウをトリガーせずに、私のソリューションはまだ有効です。
4

10 に答える 10

112

考えられる解決策は次のとおりです。

最初のスクリプトから、次の行で 2 番目のスクリプトを呼び出します。

wscript.exe invis.vbs run.bat %*

実際には、次のように vbs スクリプトを呼び出しています。

  • [パス]\スクリプトの名前
  • スクリプトに必要な他のすべての引数 ( %*)

次に、invis.vbs はWindows Script Host の Run() メソッドを使用してスクリプトを呼び出します。

  • intWindowStyle : 0 は「見えないウィンドウ」を意味します
  • bWaitOnReturn : false は、最初のスクリプトが 2 番目のスクリプトの終了を待つ必要がないことを意味します

invis.vbs は次のとおりです。

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False
于 2008-11-18T12:05:40.857 に答える
55

2 番目のバッチ ファイルを非同期で実行する必要がありますか? call通常、1 つのバッチ ファイルはコマンドと同期して別のバッチ ファイルを実行し、2 番目のバッチ ファイルは最初のバッチ ファイルのウィンドウを共有します。

second.bat使用start /b て、最初のウィンドウを共有する最初のバッチ ファイルから同期的に 2 番目バッチ ファイルを起動できます。両方のバッチ ファイルが同時にコンソールに書き込むと、出力が重複し、おそらく判読不能になります。また、exit2 番目のバッチ ファイルの最後にコマンドを配置するか、cmdすべてが完了したら 2 番目のシェル内に移動します。

于 2008-11-18T12:48:48.130 に答える
12

バッチ ファイルを exe に変換します。Bat To Exe ConverterまたはOnline Bat To Exe Converterを試して、ゴースト アプリケーションとして実行するオプション、つまりウィンドウなしを選択します。

于 2008-11-18T14:26:23.833 に答える
9

これは、DOS ウィンドウを開かずにバッチ ファイルを実行するための最も簡単で最短の解決策だと思います。一連のコマンドを定期的に実行するようにスケジュールする場合、非常に気が散る可能性があるため、DOS ウィンドウがポップアップし続けます。これが解決策です。 . VBS スクリプトを使用してバッチ ファイルを呼び出します...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

上記の行をエディターにコピーし、.VBS 拡張子を付けてファイルを保存します。それに応じて .BAT ファイル名とパスを編集します。

于 2014-01-15T06:17:16.197 に答える
7

自己非表示には、 getCmdPID.batwindowMode.batを使用できます。

@echo off

echo --- self hiding bat ----
pause
call getCmdPid.bat
set PID=%errorlevel%
call windowMode.bat -pid %PID% -mode hidden

これを達成するための方法のコレクションを次に示します。さらに可能であれば、開始されたプロセスの PID も返そうとしました (リンクされたすべてのスクリプトをダウンロードして、便利な名前で保存できます)。

  1. IEXPRESSソリューションは、古い win 95/98 マシンでも使用できます。Iexpress は、Windows にまだパッケージ化されている非常に古いツールです。引数は、コマンドとその引数のみを受け入れます。

使用例:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"
  1. SCHTASKS - ここでも、コマンドと引数の 2 つの引数のみを受け入れます。また、昇格されたアクセス許可で開始されたかどうかをチェックし、可能であれば WEVTUTIL を使用してプロセスの PID を取得します (Vista 以降で使用できるため、新しいバージョンの Windows は PID を受け取ります)。指図。

使用例:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"
  1. 'WScript.Shell' - スクリプトは 'WScript.Shell' の完全なラッパーであり、すべての可能なオプションはコマンド ライン オプションを使用して設定できます。これは jscript/バッチ ハイブリッドであり、bat として呼び出すことができます。

使用例 (詳細については、「-h」を使用してヘルプを印刷してください):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 
  1. 'Win32_ProcessStartup' - ここでも完全なラッパーであり、すべてのオプションはコマンド ライン引数からアクセスできます。今回は、一部の Jscript と一部の VBScript コードを使用した WSF/バッチ ハイブリッドですが、開始されたプロセスの PID を返します。プロセスが非表示でない場合X/Y 座標などのいくつかのオプションを使用できます (すべての実行可能ファイルに適用できるわけではありませんが、たとえば cmd.exe は座標を受け入れます)。

使用例 (詳細については、「-h」を使用してヘルプを印刷してください):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"
  1. ネットソリューション。ProcessStartInfo オプションのほとんどのオプションが使用されます (しかし、最後には疲れすぎてすべてを含めることができませんでした):

使用例 (詳細については、「-h」を使用してヘルプを印刷してください):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal
于 2015-10-15T15:21:52.240 に答える
3

「runas」を使用するか、Windowsのスケジュールされたタスクで別のユーザーの下でスケジュールすることにより、別のユーザー名で実行します。

于 2008-11-18T14:40:09.077 に答える
2

他の質問では、autoexntを提案しました。この状況でも可能です。サービスを手動で実行するように設定するだけです (つまり、起動時に自動ではありません)。バッチを実行する場合は、必要なバッチ ファイルを呼び出すように autoexnt.bat ファイルを変更し、autoexnt サービスを開始します。

これを開始するためのバッチファイルは次のようになります (未テスト):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

この方法で開始されたバッチ ファイルは、システム ユーザーとして実行されることに注意してください。つまり、ネットワーク共有に自動的にアクセスすることはできません。ただし、net useを使用してリモート サーバーに接続することはできます。

入手するには、Windows 2003 Resource Kit をダウンロードする必要があります。リソース キットは、Windows XP など、他のバージョンの Windows にもインストールできます。

于 2008-11-18T13:15:31.387 に答える
0

.vbs ファイルを介して .bat ファイルを実行できます。
次のコードを .vbs ファイルにコピーします。

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 
于 2014-01-31T12:57:33.527 に答える