タグ:コマンドプロンプト ( 10 ) タグの人気記事
(バッチ)ファイルフォルダの存在確認
バッチファイルで、ファイル・フォルダの存在確認を行う方法です。
EXIST で確認できるようですね。

参考先そのままですが、コードを掲載します。
SET filename="test.txt"
IF EXIST %filename% (GOTO FILE_TRUE) ELSE GOTO FILE_FALSE
 
:FILE_TRUE
ECHO "ファイルが見つかりました"
GOTO BAT_END
 
:FILE_FALSE
ECHO "ファイルが見つかりません"
GOTO BAT_END
 
:BAT_END

参考:
BATファイルでファイル、フォルダの存在確認
[PR]
by Jehoshaphat | 2013-03-21 22:19 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
net stop コマンドで依存するサービスも停止する

バッチファイルで、サービスの自動再起動をする処理を書いています。

サービスの停止処理は、net stop ,サービスの開始処理は net start コマンドを使います。
で、サービス停止時に、そのサービスに依存する別のサービスがあると、下記のように問い合わせてきます。

次のサービスは xxxx サービスに依存しています。
xxx サービスを停止すると、これらのサービスも停止されます。
yyyy
この操作を続行しますか? (Y/N) [N]:


この問い合わせに自動で y とする方法ですが、net stop に /y オプションを付けるといいようです。
(calsの場合は、(SQL Server)SQLサーバの無人インストールとインストール後の各種設定設定 Part3 にあるように echo y とパイプしてましたが、net stop では使えませんでした。)

下記のような感じです。

net stop "spooler" /y

これで、spooler サービスに依存する全てのサービスを停止できます。

今回はこのサービスの再起動なので、開始処理も必要です。
しかし、net start では依存するサービスの開始はできないようですね。

個別に指定して書くしかありませんか。。。

ちなみに、XP,Server 2003 以降は sc コマンドとかいうのがあり、これでサービスの制御もできるようです。


参考:
サービスの開始・停止・再起動 - コマンドプロンプトを使用したバッチファイル サービスの再起動をしてくれるバッチファイルで、ログも残してくれます。
教えて!Ziddyちゃん - システムバックアップで止めるサービスの順序
[PR]
by jehoshaphat | 2011-07-10 21:48 | 豆知識 | Trackback | Comments(0)
バッチファイルでコマンドライン引数(パラメタ)を参照する

バッチファイルで、実行時のコマンドライン引数(パラメータ)を取得する方法です。

%1 で引数一つ目、%2 で引数二つ目という感じで取得できます。
%* とすると、全ての引数を取得できます。
%0 とすると、実行したコマンド文字列自体を取得できます。


で、この引数ですが修飾子を付けることで目的の文字列にできるようです。
代表的に下記のような修飾子があるようです。(下記は一番の引数を対象にした場合)
%~1 : 二重引用符(")で囲んでいる場合、それを除去する
%~f1 : 絶対パスに変換。
%~d1 : ドライブ名取得
%~p1 : フォルダ部分のパス取得。
%~n1 : ファイル名取得。
%~x1 : 拡張子取得。
%~t1 : ファイルの日付・時刻に展開。
%~z1 : ファイルサイズ取得。
これらの修飾子は組み合わせることも可能です。
(例えば、こちらの記事のコメントと追記で書いている %^dp0 はコマンド自体(%0)にバッチファイルのフルパスが入るので、それのフォルダパスを取得して、カレントディレクトリにしましょ ということになるようです。)
その他の修飾子はEZ-NET: Windows コンソール プログラミング - バッチファイルの引数を操作するコマンドプロンプトを使ってみよう! -バッチファイルとは?が参考になります。

補足ですが、%0 にバッチファイルのパスが入っていることを利用してバッチの起動ファイルパス、起動ディレクトリを表示することも可能です。
例えば下記のようなバッチとします。

@echo off
echo 実行したバッチのパス表示(バッチファイル名含む)
echo %~f0
echo 実行したバッチのパス表示(バッチファイル名含ない)
echo
%~d0%~p0
pause

バッチファイルを D:\test\a.bat に保存して実行すると結果はこうなります。

実行したバッチのパス表示(バッチファイル名含む)
D:\test\aaaa.bat
実行したバッチのパス表示(バッチファイル名含ない)
D:\test\

また、バッチファイルを \\server01\test\a.bat に保存して実行すると結果はこうなります。

実行したバッチのパス表示(バッチファイル名含む)
\\server01\test\aaaa.bat
実行したバッチのパス表示(バッチファイル名含ない)
\\server01\test\


ちなみに、%ERRORLEVEL% とすると、直前のコマンドの返り値を取得できることは、ここでも書いてます。
(ダブルクォーテーションの中で書いても展開してくれるようですね。)

参考:
バッチメモ(Hishidama's bat-file Memo)
[PR]
by jehoshaphat | 2010-10-23 10:01 | 豆知識 | Trackback | Comments(0)
ネットワークドライブをコマンドで割り当てる
Windowsでネットワーク上の共有フォルダをネットワークドライブに割り当てる方法です。
net use コマンドを使うと容易にできるようです。
こんな感じです。

net use y: \\filesv\share\testdir


これをグループポリシーとかでログインスクリプトに仕込んでおけば全体への展開も楽ですね。
ちなみに、ネットワークドライブはユーザ単位の設定になるのでターミナルサーバとかでユーザの個人フォルダを割り当てするときには便利ですね。

参考:
MSサポート:Windows XP でネットワーク ドライブの接続および切断を行う方法
コマンドプロンプトでのネットワークドライブの割り当て
DOS「ネットワークドライブ」コマンド(Hishidama's Windows DOS command "net use" Memo)
net useコマンド - 管理者必見! ネットワーク・コマンド集:ITpro
[PR]
by jehoshaphat | 2010-09-11 00:42 | 豆知識 | Trackback | Comments(0)
(バッチ)一般ユーザ権限で、別ユーザのプロセスを落とす
バッチファイルで特定のプロセスを終了するコマンドを書いてたんですが、管理者権限が無いユーザだと別ユーザで動いているプロセスは落とせません。

しかし、RUNASというコマンドを使うと任意のユーザ権限でコマンドが発行できるようです。

使い方はこんな感じです。

runas /user:ドメイン名\ユーザ名 "taskkill /im xxx.exe"

しかし、これだとパスワードを聞かれてしまい、使用中にユーザに意識させずに...ということはできません。
echo パスワード|runas .... とか、リダイレクトとか試しましたがその場合認証に失敗します。

で結局、/savecred オプションを使うことにしました。
このオプションを付けて実行すると初回だけはパスワードを要求されますが、次回からは要求されません。
ただ、XP の Home Editionでは使用できないようです。


runas /savecred /user:ドメイン名\ユーザ名 "taskkill /im xxx.exe"


参考:
runas実行した時にきかれるパスワードを手入力以外で読み込ませたい
[PR]
by jehoshaphat | 2010-06-22 01:38 | 豆知識 | Trackback | Comments(0)
バッチファイルでフォルダ内の再帰処理
複数のユーザが使ってる Windows XP で各ユーザの Application Data 内に特定のフォルダが無ければコピーしたいという要件があります。

で、そのような処理はバッチファイルで for in do 句でループ処理を行うと可能なようです。

下記のような例となります。
rem 各ユーザプロファイルのフォルダを探す
for /D %%i in ("%SystemDrive%\Documents and Settings\*") do (
rem echo %%i

rem xxxの設定フォルダが無ければ
IF NOT EXIST "%%i\Application Data\xxx" (
xcopy "C:\xxx" "%%i\Application Data\" /e /c /q /y /i
)
rem デスクトップのショートカット削除
DEL /Q "%%i\デスクトップ\*xxx*.lnk"
)


参考:
碧落 - 知られざるバッチファイル
バッチメモ(Hishidama's bat-file Memo)
[PR]
by jehoshaphat | 2010-05-31 22:13 | 豆知識 | Trackback | Comments(0)
コンテキストメニューにコマンドプロンプトを追加する
PCセットアップすると最初にするくせによく忘れるのでメモ。。
エクスプローラでフォルダ右クリック時にコマンドプロンプトを追加する方法です。

下記のレジストリを追加すればOKです。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\OpenNew]
@="コマンドプロンプト"

[HKEY_CLASSES_ROOT\Directory\shell\OpenNew\Command]
@="cmd.exe /k \"cd %L\""


参考:
@IT:Windows TIPS -- Tips:エクスプローラでカレント・フォルダを選択してコマンド・プロンプトを開く
不定期メモ: エクスプローラのコンテキストメニューにコマンドプロンプトを追加する UNC対応の方法も書かれてます。
[PR]
by jehoshaphat | 2010-05-23 07:45 | 豆知識 | Trackback | Comments(0)
共有フォルダ上のバッチファイルのカレントパスはどこになる?
Windows 共有フォルダにバッチファイルを置いて、同じフォルダに置いてあるexeファイルを相対パス指定で実行する処理を書きました。下記のような感じです。
バッチファイルを ¥¥servername¥testdir¥test.bat とします。バッチ内では ¥¥servername¥testdir¥text.exe を実行させます。

@echo off
test.exe

それをグループポリシーのスタートアップスクリプトで実行させようとしたが、どうにも実行されません。。

で、普通にエクスプローラ上からそのバッチを実行すると、バッチ実行時のカレントパスが C:¥windows 直下になっていました。

どうやらバッチファイルは普通には UNC パスをカレントパスにできないみたいです。
よって、実行時のカレントパスがシステムフォルダとなり、相対パスで指定してた test.exe が見つからないのでエラーとなった感じです。

ただ、カレントパスを UNC パスにはできませんが、ファイルの指定には UNC パスは指定できるようです。
こんな感じです。

C:\Documents and Settings\usera>copy \\servername\testdir\test.txt \\servername\testdir\test222.txt
1 個のファイルをコピーしました。


ということで、最初問題となったバッチは exe を相対パス指定ではなく UNC パスを使った絶対パスとすることで解決しました。

余談ですが、コマンドプロンプトでUNC パスをカレントにするには、ネットワークドライブとして割り当てる必要があるようです。
そこら辺は下記が参考となります。
コマンドプロンプトで「CMD では UNC パスは現在のディレクトリとしてサポートされません。」
共有フォルダ上で,マウスだけで一発でコマンドプロンプトを開く方法 (UNCパスへのpushdをバッチクリックで済ませる) - 主に言語とシステム開発に関して
[PR]
by jehoshaphat | 2010-05-12 23:52 | 豆知識 | Trackback | Comments(0)
xcopyでフォルダコピー時に「ファイル名ですか、またはディレクトリ名ですか」と聞いてくる
下記のようなバッチファイルで、xcopy でフォルダコピーを書いてました。(相対パス指定でのコピーです。a,b,cはフォルダを表してます。)

xcopy "a" "b\c" /e /c /q /y
pause


なお、この時のフォルダ構成は下記のような感じです。

├─a
│ └─a
│ test.txt

└─b


コピー先が b¥c なのですが、c フォルダが無いパターンです。

この場合、バッチを実行すると下記のようなメッセージが表示され、入力を要求されます。

D:\mydoc\豆知識>xcopy "a" "b\c" /e /c /q /y
b\c は受け側のファイル名ですか、
またはディレクトリ名ですか
(F= ファイル、D= ディレクトリ)?


"D"を選択すると、ちゃんとコピーされますが、"F"を選択すると、c というファイルができてしまいます。
XCOPY - 拡張COPY [FPCU]DOS/V&Windowsコマンド・プロンプト・リファレンスによると、「複写先が既存のディレクトリを含まず、かつ、名前が円記号(¥)で終わっていない場合」に表示されるようです。


回避策としては、/i オプションを付けるか、受け側の指定を¥で終端するといいようです。

xcopy "a" "b\c\" /e /c /q /y
もしくは
xcopy "a" "b\c" /e /c /q /y i


余談ですが、ファイルのコピーで xcopy 使うときも同様の現象が出るようなので、下記のように強制的にファイルに指定してやるといいようです。

echo F | xcopy test.txt test2.txt /R /Y


参考:
単一ファイルコピー時に xcopyが「またはディレクトリ名ですか」ときいてくる罠の回避。 - 片っ端から忘れていけばいいじゃない。
[PR]
by jehoshaphat | 2010-03-10 18:30 | 豆知識 | Trackback | Comments(2)
コマンドプロンプトでシステムドライブ直下にフォルダを作る
バッチファイルを使った操作でシステムドライブ直下(普通はC:\)にフォルダを作って、アクセス権を EVERYONE フルコントロールにするという要件です。

まず、システムドライブですが %systemdrive% パスで出来るようです。たしかこれって環境変数に登録されてんですよね。
なので、システムドライブ直下にフォルダを作るのは、

>md %systemdrive%\1234

てな感じでOKです。

アクセス権は(SQL Server)SQLサーバの無人インストールとインストール後の各種設定設定 Part3 で書いてたように

>echo y|cacls %systemdrive%\1234\test.mdf /G EVERYONE:F

で行けます。
[PR]
by jehoshaphat | 2009-07-07 23:13 | 豆知識 | Trackback | Comments(0)