ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ホーム > コミュニティ > PC、インターネット > DOSシェルプログラミング > トピック一覧 > コマンド質問箱

DOSシェルプログラミングコミュのコマンド質問箱

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コミュ内全体

必ず回答があるとは保障できませんが、識者の方からの回答があるかも知れません。

そんなときはここで質問してね。

コメント(100)

ihatovo さん

PATHの通ったフォルダに exit とだけ書いたバッチを置く。
それを q.bat とか短い名前にしておけば1文字のタイプで exit 可能ですよ。
>とがくしさん
一文字だけのバッチファイルですね、なるほど。
さっそくやってみます。

しかし、

c:\>q<cr>

enterキーを押すのが面倒だなあ(^_^)
ウインドウの×を押せばよいかと(笑)
キーボードだけなら、ALT+SPACE→Cで。
>ofさん
確かにXを押せばいいのですが、DOS窓を使って
る時は、指がキーボードをさわってるので、いちいち
マウスを使うのがめんどうなんです(^_^;)

>キーボードだけなら、ALT+SPACE→Cで
これは知らなかった。ありがとうございます。

しかし、windows98ではfunction key を使って
やっていただけに、まだこだわってます(^_^;)
閉じないと言う方法もありますよ。一旦閉じちゃうとコマンドヒストリが消えるので、当面の用事が済んでも放置することが多いです。

私としては、ファンクションキーに指を伸ばすくらいならexit<ctrl-M>と打った方が楽だなあ。
>otnさん
おお、ファンクションキーよりも手動で打つほうが楽、
ですか、すごいなあ(^_^)

ま、exit<cr>くらいどうってこともないんでしょうが、
run<cr>が F5KEY とかもう指が憶えてるんですわ、
私の場合(^_^)
DOS窓でコマンドを本気になって使うとき、
 Alt + Enter
を押してしまう管理人ですw。
ファンクションキーはホームポジションから指が離れるから嫌いって人が居ますよね。
またマウスで[×]をクリックも同じですね。

閉じるならexitでしょう。
エンター含めてもたった5文字ですし、
 E 左手中指
 X 左手薬指
 I 右手中指
 T 左手人指指
 ENTER 右手小指 もしくは Ctrl + M
と同じ指で連続して打鍵する事はありません。
つまりタイムラグは少ない。

まぁ、頻繁に使うのでそもそも閉じない事の方が多いですけどね。
はじめまして(かな)。
ワタシは自分のマシン以外の環境で操作することも多いので
なるべく標準の機能や設定の範囲内で
なるべくキーボードのみで操作するようにしています。

コマンドプロンプトの起動は [WINDOWS]+R CMD [ENTER]
終了は EXIT [ENTER]
または [ALT]+[SPACE] C
ですね。

そりゃふつーは EXIT ですが
コマンドプロンプトでの [ALT]+[SPACE] は
[ALT]+[SPACE] E P
でクリップボードから貼り付け
なんてのにも利用できますから、覚えておいて損はないと思います。

こないだ触ったノートパソコンには
Windowsキー(=旗)がなくてかなり面食らいました。
最近は旗キー多用しているもんで。
はじめまして。
バッチでコマンドの実行結果を
環境変数に代入することは可能でしょうか?

shだと
sh> FILE_LINE = `wc -l hoge.txt`
こんな感じで代入できると思いますが。

そもそも何がしたいかというと、
ファイルに日付時刻を付けてバックアップ取りたいのです。
%TIME%ガリガリ文字列を取っても午前中だとうまくとれないからです。
例えばAM8時だと"08"って文字列が欲しいが" 8"となります。

日付のプロパティをいじれば08となるのかもしれませんが、
環境依存にしたくないので、日付時刻を標準出力にだす
プログラムを作ったのですが、そもそも実行結果を
環境変数に代入する方法がわからなくて質問しました。

もしご存じの方がいらっしゃいましたらよろしくお願いします。
ZEROさん

はじめまして.TAKAchといいます.
shでいう,「'abc.exe -l'」などのコマンドの結果を環境変数に代入できます.
WindowsのDOSプロンプトで使えるか確認していませんが,
MS-DOS用ツールがあります.
BU
http://www.vector.co.jp/soft/dos/util/se023753.html
>> そもそも何がしたいかというと、
>> ファイルに日付時刻を付けてバックアップ取りたいのです。
>> %TIME%ガリガリ文字列を取っても午前中だとうまくとれないからです。
>> 例えばAM8時だと"08"って文字列が欲しいが" 8"となります。

同トピックの49あたりが参考になると思います。
ofさん

XPなどのコマンドプロンプトでは外部ツールなくても,コマンドの標準出力を環境変数に代入できるってことですか?
質問の内容を見ると時間を代入したいだけのようだったので。
外部コマンドからの取り込みでしたら、jackson さんの指摘どおりFORのヘルプにやり方が記述されています。
ZEROさん,ofさん,jacksonさん

質問と回答の途中で,僕が,割り込んじゃったみたいでごめんなさい.参考になりました.
TAKAchさん,ofさん,jacksonさん

回答ありがとうございます。
「for /f」と「set /p」の両方で思い通りの結果を得ることができました。

それにしてもforは奥が深いですね。^^
regsvr32
の成功時、失敗時の戻り値どなたかご存知でしたら教えて下さい!!
>> regsvr32
私も以前に調べたことがありますが、多分異常終了の検知はできません。
ありがとうございます。正常に登録できた際の戻り値はありますか?
このツールの場合、戻り値(ERRORLEVEL)を調べても無駄です。
※正常でも異常でも0でした
助かります!ありがとうございます。
もう一つご存じでしたらお聞きしたいのですが、成功、失敗を切り分ける方法があれば教えて下さい。
滅多に失敗するものではないので失敗したらもう一度実行すればいいと思いますが、気になるのであればregsvr32を自作するしかないかもしれません。

※なぜか失敗する場合があるんですよね。
皆様ありがとうございます。スケジュール管理にしたいんですよ・・・。なかなか厄介ですね。
●バッチスクリプトで「オプション」を解釈したい
自作のバッチスクリプトの引数に、MS-DOSコマンドに指定するような
「オプション」を渡されたときに、解釈したいのですが、
どなたかエレガントなやりかたをお教えいただけないでしょうか。

DOSコマンドの書式って、おおよそ次の通りかとおもいます。
? /Y /F 等 /(スラッシュ)で始まる。
?/HOME 等、オプション名は1文字以上を許容する。
?/PARSITENT:NO /USER:hillock@mixi.jp のように、オプション名の
 後に:を付けて文字列を続けることで、オプションに文字列を渡せる。
(?と?はnet use コマンドより)

解釈機能の仕様としては、上記書式指定のオプションを解釈した上で、
hoge.bat /opt1:aaa arg1 /opt2 arg2
といった形で指定されたときに、arg1が%1に、arg2が%2に、つまり
?%1〜%nには、オプションを除いた引数が格納される。
?オプションと引数の並びは順不同を許容する。

自作コマンドでもオプションを他のDOSコマンドと同じようにすることで、
スクリプトのつくりを柔軟にできたらいいな、と思っています。
自分でも一応作ってみたのですが、、たたき台にしてやってください。
下記の例では、/c と /PARSISTENT を解釈します。
/PARSISTENTは文字列を受け取ります(100文字まで)

--ここからスクリプト----------------
setlocal
:getopt_start
set opt=%1
rem opt=%opt%
set opthead=%opt:~0,1%
if "%opthead%"=="/" ( goto getopt ) ELSE goto getopt_end
rem --getopt----オプション解析処理本体---
:getopt
if "%1"=="/c" set opt_c=y
if "%opt:~0,11%"=="/PARSISTENT" set opt_PARSISTENT=%opt:~12,100%

shift
goto getopt_start
rem -------------------------------------
:getopt_end

echo %opt_c%
echo %opt_PARSISTENT%
echo %1 @ %2 @ %3
endlocal
--ここまで----------------------------

このつくりだと、前述の?
?オプションと引数の並びは順不同を許容する。
が実現できていません。
(まあ、これは最悪制約事項としてもいいかもしれませんが)
オプションは、オプション解釈サブルーチンを定義して、ローカルの
環境変数の中に代入してしまう、といった形でよいと思います。
(perlのgetoptのように。)

OSはWin-XP Home Editionで確認しました。
いろいろ考えて見ましたが、エレガントは無理で、力技しかなさそうです。
?と?の両立は、shift /%N% で。
ひろっくさんのをベースにして、

@echo off
setlocal
set N=1
:getopt_start
call set opt=%%%N%
if "%opt%"=="" goto getopt_end
if "%opt:~0,1%"=="/" goto getopt
set /a N+=1
goto getopt_start
rem --getopt----オプション解析処理本体---
:getopt
if /i "%opt%"=="/C" set opt_c=y&goto getopt_shift
if /i "%opt:~0,12%"=="/PERSISTENT:" set opt_PERSISTENT=%opt:~12,100%&goto getopt_shift
echo error invalid option "%opt%"
:getopt_shift
shift /%N%
goto getopt_start
rem -------------------------------------
:getopt_end

echo optc=[%opt_c%]
echo optp=[%opt_PERSISTENT%]
echo arg1=[%1] arg2=[%2] arg3=[%3] arg4=[%4]
endlocal
>otnさん
レス有難うございます^^

最初 call set opt=%%%N% が何やっているのか分からなかったのですが
optにN番目引数の値を代入する処理で、2度変数を展開させるために使われているのですね。

(例えば、N=1のとき、%%が% に、 %N%が 1に展開されて
 call set=%1
 になって、 callで「set=%1」が解釈実行されて、
 結果、%1の変数がoptにセットされる。)

オプション解析部のifを /i (大文字小文字の区別をなくす)にして、よりDOSコマンドらしくしたりとか、非対応のオプション指定にはエラーメッセージを出したりとか、細かい気配りがすばらしいです^^

これで、当初求めていた仕様は達成できました。ありがとうございます♪
はじめまして。

tasklist /fi "username eq ユーザ名" | find /c "プロセス名"

によって特定のユーザによって起動されているプロセスの数を取得し、
その数によってその後の処理を切り分ける

ということをしたいのですが、可能なのでしょうか。
>91

そのままでいくと、
for /f %%A in ('tasklist /fi "username eq ユーザ名" ^| find /c "プロセス名" ') do set CNT=%%A
で。

あるいは、
set CNT=0
for /f %%A in ('tasklist /nh /fi "username eq ユーザ名" /fi "imagename eq プロセス名.exe" ') do set /a CNT+=1
>>otnさん

遅くなりましたが、コマンドの例まで記述していただき
ありがとうございます。

ちなみに、今回はWSHにて特定のプロセス数を取得して
戻り値で処理を分岐させる方法をとりました。


ある環境下で複数あるマシンにインストールされている
アプリケーション情報(プログラムの追加と削除に表示される情報)を
パッチで取得するにはどうすればいいでしょうか?
また、取得した情報をCSV出力し、運用監視端末に転送したいと考えています。

【対象端末】
Windows server 2000
Windows server 2003

宜しくお願いします。
レジストリに情報があるのでregコマンドで読むのでしょうね。
具体的な場所は「レジストリ プログラムの追加と削除」でぐぐってください。

Windows2000はregコマンドが標準でインストールされてないので追加でインストールが必要。これもググルと情報があります。

CSVへの加工はバッチコマンドだけでは不可能ではない物の大変面倒。コマンドの出力内容を読み取るのはforコマンドで出来るので、地道にやってください。

VBScript(or JScript)+WSHでやったほうが楽でしょうね。WSHだとRegReadメソッドで直接レジストリが読めます。Windows2000だとWSHも標準でなかったかな。
kshでバックアップを定期的に取得しようと、考えているのですが。

複数のディレクトリを一つのtar.gzに固めて、日付をつけた形にしたいのですが可能でしょうか?

わかる方いたら教えていただけないでしょうかm(_ _)m
本当に初心者ですみません。
よろしければご教授頂ければ幸いです。

Aフォルダのa.txtファイルを同じAフォルダ内のbackファルダに、日付をつけて保存するバッチを作りたいのですが、コピーまでは上手く出来るのですが、日付がつかなくて…。

詳細
xcopy使用してます
最終的にはタスク設定を使い、毎朝PCを立ち上げる度に、日付の入ったバックアップを残したい。
タスク設定は大丈夫ですので、あくまでバッチは違うフォルダに自動日付を入れて…みたいなのが希望です。
robocopyでも、可能です。

いろいろ調べてみたのですが、中々うまくいかず…。
助けて頂ければ幸いです。

vista
>>[98]
お返事ありがとうございます。

自動化はその通りです。
パソコンを毎日立ち上げるので、その度にその日付の入ったコピーファイルを作りたいのです。

書き込みがスマフォからで、詳しいコマンドラインの貼り付けが出来ないのですが、エラーメッセージが出るわけではなく、実行してもコピーファイルが出来ていない状態です。

説明下手ですみません。

ログインすると、残り65件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

DOSシェルプログラミング 更新情報

DOSシェルプログラミングのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング

mixiチケット決済