0

Npackdで次のスクリプトを使用してDropbox をアンインストールします。XP と Vista では動作しますが、Windows 7/64 では失敗します。タスクバー (通常は画面の下部にあるもの) を表示する代わりに、C:/ のコンテンツを含む Windows エクスプローラー ウィンドウを表示します。DLL ベースのシェル拡張を持つ他のパッケージを削除しても同じ効果が見られるため、これは Dropbox に関連したものではありません。

Uninstall.exe /S _?=%CD%
taskkill /f /fi "IMAGENAME eq explorer.exe"
del DropboxExt.13.dll
del DropboxExt64.13.dll
rem start explorer from the root directory so it does not lock this one
start "" /D\ explorer.exe

スクリプトの何が問題になっていますか? Windows 7 でも正しく動作するように変更するにはどうすればよいですか?

ありがとう

編集:私はこの問題に本当にうんざりしています。次のバッチ ファイルは、通常のユーザーとして開始するか、「管理者として」開始するかのいずれかで機能します。

taskkill /f /fi "IMAGENAME eq explorer.exe"
ping -n 5 127.0.0.1
pushd \
rem runas /trustlevel:0x20000 
start "" /D\ explorer.exe
popd

私のプログラムから .bat を開始するコードは次のとおりです (path="Uninstall.bat"、2 つの新しい環境変数のみが定義されています)。

QDir d = this->getDirectory();
QProcess p(0);
p.setProcessChannelMode(QProcess::MergedChannels);
QStringList params;
p.setWorkingDirectory(d.absolutePath());
QString exe = d.absolutePath() + "\\" + path;
for (int i = 0; i < env.count(); i += 2) {
    p.processEnvironment().insert(env.at(i), env.at(i + 1));
}
p.start(exe, params);

Qt/qprocess_win.cpp の対応するコード:

DWORD dwCreationFlags = CREATE_NO_WINDOW;
dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
STARTUPINFOW startupInfo = { sizeof( STARTUPINFO ), 0, 0, 0,
                             (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT,
                             (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT,
                             0, 0, 0,
                             STARTF_USESTDHANDLES,
                             0, 0, 0,
                             stdinChannel.pipe[0], stdoutChannel.pipe[1], stderrChannel.pipe[1]
};
success = CreateProcess(0, (wchar_t*)args.utf16(),
                        0, 0, TRUE, dwCreationFlags,
                        environment.isEmpty() ? 0 : envlist.data(),
                        workingDirectory.isEmpty() ? 0 : (wchar_t*)QDir::toNativeSeparators(workingDirectory).utf16(),
                        &startupInfo, pid);

Explorer がタスクバーが既にあると考えるのはなぜですか?

EDIT2:今何が悪いのか知っています。エクスプローラーが強制終了された後、svchost.exe プロセスによって次のパラメーターを使用して新しいプロセスが自動的に開始されます: /factory,{682159d9-c321-47ca-b3f1-30e36b2ec8b9}。GUID は DesktopExplorerFactory 用です。これはおそらく、COM サービスのクラッシュ保護です。explorer.exe を呼び出しても、新しい Explorer が既に存在するため、起動しません。ウィンドウが開かれていない場合、1 ~ 2 分後にこのプロセスは自動的に閉じられます。したがって、Ben Voigt は正しく、「すべてのユーザーをログオフせずにシェルを完全にアンロードする良い方法は実際にはありません」と思います。

4

3 に答える 3

1

次の行を置き換えてみてください

start "" /D\ explorer.exe

これで

start "" /D\ %SystemRoot%\explorer.exe

これにより、パラメーターなしでエクスプローラーが実行されます。

問題は、フルパスなしでエクスプローラーを実行すると、指定したパラメーターで実行されることです。

/factory,{682159d9-c321-47ca-b3f1-30e36b2ec8b9}

しかし、なぜこれが起こるのかわかりません。

于 2013-02-08T19:10:24.773 に答える
1

スクリプトの問題点は非常に単純です。シェルは、Windows エクスプローラーだけでなく、多くのアプリケーションに読み込まれます。共通のファイルを開く/保存するダイアログを使用するすべてのアプリケーションは、シェルをホストします。

ウィンドウを開く引数を渡さずに Windows エクスプローラーの作業ディレクトリを制御する方法に関する当面の質問に対処するには、作業ディレクトリを設定するだけです。

pushd C:\
start explorer.exe
popd

ただし、これでも拡張機能を確実に削除することはできません。すべてのユーザーをログオフせずにシェルを完全にアンロードする良い方法はありません。

編集: スクリプトは、殺した元の explorer.exe と同じ整合性レベルで実行されていますか? 同じ高さですか?シェルは中 (通常) の整合性レベルと昇格されていないトークンで実行されます。これを一致させる必要があります。

于 2010-12-20T16:05:21.657 に答える
1

価値があるのは、あなたのコマンド「start "" /d\ explorer.exe」は、win7でも問題なく動作するようです。タスクバーとデスクトップが強制終了された場合、再起動します。

ただし、「開始」は本当に必要ありません。バッチ ファイルから "explorer.exe" を呼び出すだけで、ブロックされません。これが違いを生むかどうかはわかりませんが、試してみる価値があります。

ところで、それがうまくいかない場合... ctrl+shift+esc でタスク マネージャーを起動し、[ファイル] -> ["エクスプローラー" を実行] を実行すると、影響を受けるコンピューターで何が起こりますか? それはタスクバーを起動しますか、それともエクスプローラーウィンドウを生成しますか? これで期待どおりの結果が得られる場合は、バッチ ファイルまたはその環境に問題がある可能性があります。現在ログオンしているユーザーとして実行されていないなど。

独自のプロセスのインスタンスが他にない場合、エクスプローラーはタスクバーを起動する必要があります。シェル自体が他のプロセスにロードされる可能性があるという事実は問題ではありません...エクスプローラーのすべてのインスタンスを強制終了し、Excelで「ファイルを開く」ダイアログを表示し、タスクからexplorer.exeを実行してタスクバーを再起動できますマネジャー。

于 2010-12-22T00:55:46.440 に答える