PowerShellでCMDコマンドを実行する


87

PowerShellコマンドを実行する際に多くの問題が発生しています。実行しているのは、CMDプロンプトウィンドウで実行されるコマンドを実行することだけです。

コマンドは次のとおりです。

"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

私は以下を試しましたが成功しませんでした(これを何度も繰り返して、機能するものを取得しようとしました。構文はおそらくすべて台無しになっています):

$TEXT = $textbox.Text #$textbox is where the user enters the PC name.
$CMDCOMMAND = "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"
Start-Process '"$CMDCOMMAND" $TEXT'
#iex -Command ('"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"' $TEXT)

このコマンドは、ユーザーがテキストボックスで指定したコンピューターへのSCCMリモート接続ウィンドウを開くだけです。


使用しているSCCMのバージョンはわかりませんが、07には「-1」が必要ですが、2012ではCmRcViewerを起動するときに必要ありません。参考までに。
kevin_ 2014

回答:


102

これを試して:

& "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

PowerShellにとって、文字列「...」は単なる文字列であり、PowerShellはそれを画面にエコーすることによって評価します。PowerShellに、名前が文字列に含まれるコマンドを実行させるには、call演算子を使用します&


素晴らしい、これはうまくいきました。それはほとんどのcmdコマンドで機能するはずですか?
user3585839 2014

4
はい。ただし、名前またはパスにスペースが含まれていないexeには必要ありません。たとえば、ipconfig.exeを使用せずに実行できます&。使用する必要があるの&は、文字列形式でコマンド名を呼び出す場合のみです。また、パスまたはファイル名にスペースがある場合は、「文字列形式」を使用する必要があります。
キース・ヒル

17
&PowerShellは文字列全体が実行可能ファイルの名前であると見なすため、コマンドライン文字列を作成してで実行しようとしても機能しないことを付け加えておきます。代わりに、実行可能ファイルの名前のみを引用し、後で実行可能ファイルのパラメーターを入力します。
Bill_Stewart 2014

間の差分何である&とはcmd
ティモ

1
&PowerShell呼び出し(別名呼び出し)演算子です。コマンドの名前またはexeへのパスのいずれかを含む文字列である場合に、コマンドを実行できます。スクリプトブロックなど&{$foo=42}またはCommandInoオブジェクトなどを指定することもできます$cmd = Get-Command Get-Date; &$cmdcmd別のシェルです。&は子スコープで実行されるため$foo、上記で設定したスクリプトブロックが終了した後$fooは、もう設定されていないことに注意してください。
キース・ヒル

56

PowerShellから外部でバッチファイルを実行または変換するには(特に、スケジュールされたすべてのタスクスクリプトに証明書で署名する場合)、PowerShellスクリプト(deletefolders.ps1など)を作成するだけです。

スクリプトに以下を入力します。

cmd.exe /c "rd /s /q C:\#TEMP\test1"

cmd.exe /c "rd /s /q C:\#TEMP\test2"

cmd.exe /c "rd /s /q C:\#TEMP\test3"

*各コマンドは、cmd.exeを再度呼び出す新しい行に配置する必要があります。

このスクリプトは、PowerShellから署名して実行し、コマンドをコマンドプロンプトにcmd直接出力できるようになりました。

バッチファイルを実行するよりもはるかに安全な方法です。


これは私にとってはうまくいきました。私は実行しようとしていました:sc query serviceNamePowerShellから、実行されると思っていましたが、出力がありませんでした。サイコロを使わずに、&テクニックを何度か試しました。しかし、あなたが推奨した方法でそれを実行することはうまくいきました。次に、cmd.exe /?他にどんな不思議が私を待っているかを見るために。私は必要なときにだけcmdを実行するのが好きです。
PaulMasek20年

9

1つの解決策は、コマンドをPowerShellからCMDにパイプすることです。次のコマンドを実行すると、notepad.exeコマンドがCMDにパイプされ、メモ帳アプリケーションが開きます。

PS C:\> "notepad.exe" | cmd

コマンドがCMDで実行されると、PowerShellプロンプトに戻り、PowerShellスクリプトの実行を続行できます。


編集

CMDの起動メッセージが表示されます

mklement0ポイントうち、このメソッドはショーCMDの起動メッセージ。上記の方法を使用して出力を別の端末にコピーする場合は、起動メッセージが一緒にコピーされます。


&動作しない場合でも動作します。例えば& "mklink"ながら、私のために動作しませんでした"mklink" | cmd働いていた
moudrick

2

この情報が必要な場合:

PATHPSスクリプトから自分の中にあるコマンドをほぼ実行でき、それが機能するはずだと思いました。

場合によっては、このコマンドを次のコマンドで事前に起動する必要があります。 cmd.exe /c

PSスクリプトからgitを呼び出す

PSスクリプトを大量に使用するgitクライアントをラップして再パッケージ化する必要がありましたChocolatey(知らない人のために、これはWindows用の一種のアプリストアです)。

gitは、一度PATH、のようなコマンドがあることを知りました

$ca_bundle = git config --get http.sslCAInfo

git crtファイルの場所を$ca_bundle変数に格納します。

アプリを探しています

現在のSOポストとこのSOポストの組み合わせである別の例は、whereコマンドの使用です。

$java_exe = cmd.exe /c where java

java.exeファイルの場所を$java_exe変数に格納します。


1
などの内部コマンドcmd /cを呼び出すだけで済みます。対照的に、は外部プログラムであるため、直接呼び出すことができます。ただし、PowerShellの組み込みエイリアス(の)と名前が競合するため、;を使用する必要があります。例:。mklinkwhere.exewhereWhere-Objectwhere.exewhere.exe java
mklement0 2018年

またはGet-Command、呼び出す代わりにPowerShellを使用しcmdますか?:前と同じ$java_exe = $(Get-Command java.exe).Source
dtasev

-1

この外部プログラムを起動するには、Invoke-Commandコマンドレットを使用する必要があります。通常、それは努力なしで動作します。

複数のコマンドが必要な場合は、-scriptblockオプションを指定してInvoke-Expressionコマンドレットを使用する必要があります。


1
この場合、Invoke-Commandは必要ありません(Keith Hillの回答を参照)。
Bill_Stewart 2014

はい、同意します。私はスクリプトソリューションについてもっと考えていました。
ティムクリスティン

4
コマンドがスクリプトから実行されるかどうかは関係ありません。この場合でも、Invoke-Commandを使用する必要はありません。
Bill_Stewart 2014


なし例との「答え」を提供しないでください
AX
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.