【pwdコマンドもどきをbatファイルとPythonで作ってみるテスト(Windows/python)】
追記
Windowsの移動コマンドcdは引数を与えない場合、Linuxコマンドのようにホームディレクトリにワープしないで、カレントディレクトリを返すことを知った。
なので、この投稿の目的だった「カレントディレクトリのみの取得」は
>cd
で済み。ということで
アゥフ(-_-)
【目的・目標】
初心者による初心者向け、個人メモ用投稿。
Windowsの「dir」コマンドでは「カレントディレクトリ」と「ディレクトリ内にあるのフォルダとファイルの表示」が一緒に出力されます。
これはシェルコマンドの「pwd」と「ls」の混ぜ合わせです。
今回の目的は、カレントディレクトリだけを取り出す「pwd」コマンドもどき(オプションなし)をdirを利用して作ってみます。
また「pythonスクリプト作成」「コマンド入出力」「バッチファイル作成」「バッチファイル実行」等の練習を兼ねております。
全てのプロセスをbatファイルにスクリプトで書けばもっと簡単にできるのかもしれません、当方の能力的事情により途中Pythonを使用しております。
Pythonスクリプトとbatファイルを組み合わせれば何か便利なものが作れててラッキーということで…
今回やるのは、こうしたら
>pwd
↓こう表示できるように
C:Users\ユーザー名\Desktop
するだけの試みです。
今回デスクトップに
【batファイル pwd.bat】
【Pythonスクリプト read_dir_stdout.py】
【(自動作成)テキストファイル dir_stdout.txt】
の3つを作成予定です。
無駄に長い投稿なので、手っ取り早く結果を得たい方は
- 2.3の一番下にある read_dir_stdout.py
- 3.2の一番下の pwd.bat
の二つのファイルをデスクトップに作成後、pwd.batをデスクトップから実行してください。
【目次】
【作成環境】
Windows10
Python3.7
【必要なもの】
PythonがインストールされたWindowsPC
【作るファイルは2つ + 1(datで自動作成)】
【おおまかな手順】
batファイルを実行
→ dirコマンドをファイルに書出
→ それをPythonで読み取り加工しprint
→ コマンドプロンプトに出力
【作成】
1. 作成準備
1.1 コマンドプロンプト起動
コマンドプロンプトを起動します。
キーボードのWindowsキーを押してそのまま「cmd」「コマンドプロンプト」等と入力する。
入力途中(cかkを入力した段階で既に)に「最も一致する検索結果」に「コマンドプロンプト」と出ていればそのままEnterキーを押せば起動できます。
その他
Windowsキー+R 「ファイル名を指定して実行」で「cmd」入力後にEnterキーで起動。
マウスでスタートメニュー「windowsシステムツール」から「コマンドプロンプト」をクリックで起動。
【メモ】
コマンドプロンプトやターミナル操作ではキーボードの上下カーソルキーで入力履歴が出てくる。
何度も同じ入力をタイピングする手間が省略できる。
1.3 dirをファイル出力
次のコマンドを実行すると、カレントディレクトリと、そこのフォルダ・ファイル名が表示されます。
「dir」と入力してEnterキー
C:Users\ユーザー名\Desktop>dir
はい、プロンプト上に表示されました。
ちょっと実験。
いま表示されたものを活用したいので、それをファイルへ書き出してみたいと思います。
「コマンド名 > ファイル名」とすれば出来ます。
「dir > うんこ.txt」と入力してEnterキーを押します。
>dir > うんこ.txt
デスクトップにブリッと品性のあるなにがしかが現れたかと思います。
中を見ればプロンプトで表示されていたものと同じものの書き込みが確認できると思います。
ブリッと出たものは必要ないので水に流してゴミ箱へ。
以上、実験は終わり。
このテクニックを後でbatファイル作成時に使います。
2. Pythonスクリプト作成
2.1 Pythonスクリプト作成(試験用)
コマンドdirで得られる標準出力の4行目には
C:\Users\ユーザー名\Desktop のディレクトリ
とカレントディレクトリが表示してありますが、この行をPythonスクリプトを使って取り出します。
そして「のディレクトリ」と不要な「スペース」を削除します。
先に書きますが
★保存先 : デスクトップ ★ファイル名 : read_dir_stdout.py
で必ず保存します。
ここを変えると「ファイルが見つからない」などとWindowsに言われてしまいます。
with open("dir_stdout.txt","r") as f: # 1行ずつ読み取り desktop_lists = f.readlines() #変数desktop_listsの中身 print("\nread_dir_stdout.py 変数desktop_listsの中身 : \n",desktop_lists) #変数desktop_listsのtype print("\nread_dir_stdout.py 変数desktop_listsの型 : \n",type(desktop_lists)) # list型変数desktop_listsのindex3(4行目)から不要な文字列を削除し変数pwdに代入 pwd = desktop_lists[3].replace("のディレクトリ","").replace(" ","") print("\nカレントディレクトリ : \n",pwd)
2.2 試しにPythonスクリプトを実行
今作ったPythonスクリプトをコマンドプロンプトから実行します。
以下のように入力します。
C:\Users\ユーザー名\Desktop>python read_dir_stdout.py
↓のように出たらOKです。
read_dir_stdout.py 変数desktop_listsの中身 : [なんかズラズラ~っとデスクトップ上のなにがしかがカンマ区切りで羅列] read_dir_stdout.py 変数desktop_listsの型 :カレントディレクトリ : C:\Users\ユーザー名\Desktop
出ましたでしょうか。
一番下に目的の「カレントディレクトリ」が取り出せました。
2.3 Pythonスクリプトの書き換え
不要なものを削除。
print("\nread_dir_stdout.py 変数desktop_listsの中身 : \n",desktop_lists)
と
print("\nread_dir_stdout.py 変数desktop_listsの型 : \n",type(desktop_lists))
は必要ないのでけします。
さらに最終行の
print("\nカレントディレクトリ : \n",pwd)
もprint()内の文字列は必要ないので書き換えます。
最終的に必要なもの以外全て消したのがこちら。
with open("dir_stdout.txt","r") as f: desktop_lists = f.readlines() pwd = desktop_lists[3].replace("のディレクトリ","").replace(" ","") print(pwd)
書き換えたのがちゃんと動くか確認。以下を実行。
>python read_dir_stdout.py
C:\Users\ユーザー名\Desktop>pwd C:\Users\ユーザー名\Desktop
次ではbatファイルで作ります。
3. batの作成
ファイルの作成はこれで最後。
バッチファイルを作っていきます。
3.1 batファイル作成時の注意点
3.2 batファイル作成
メモ帳を開きます。
先に書きますが
★保存先 : デスクトップ ★ファイル名 : pwd.bat
です。
ここを変えると
「操作可能なバッチファイルが見つからないか認識できない」
とWindowsに言われてしまいます。
作ったbatファイルは今回はコマンドプロンプト上から入力実行させます。
ではbatファイルを書きます。
@echo off dir > dir_stdout.txt python read_dir_stdout.py
ファイル名「pwd.bat」でデスクトップに保存。
【batファイルの説明】
1行目の
@echo off
コマンドプロンプトがコマンド実行時に出す表示を消す為の物です。
これを書かないで実行すると
C:\Users\ユーザー名\Desktop>dir 1>dir_stdout.txt C:\Users\ユーザー名\Desktop>python read_dir_stdout.py C:\Users\ユーザー名\Desktop
と表示される。
書けば
C:\Users\ユーザー名\Desktop
次に下の2行
dir > dir_stdout.txt python read_dir_stdout.py
上の行は 「dirコマンドは標準出力結果をdir_stdout.txtという名前でファイルに書き出しなさい」という命令。
下の行は「pythonはread_dir_stdout.pyというファイルを読みなさい」という命令。
batファイルを実行すれば、その中に書いた命令群を実行する度に毎回プロンプトに打ち込まずとも、一気にまとめて実行できるという具合です。
4. datファイル実行
実行して目的の結果が得られたら今回は完了。
得たい結果はこれを出すこと。
C:\Users\ユーザー名\Desktop
batファイルの実行によって得られた結果である点で先ほどと異なっています。結果は同じ。
完成品の実行
>pwd
目的の実行結果と同じものが出たでしょうか。
5. まとめ他
ジミ過ぎる結果に誰得な感じでした。
発展的にちょっといじって、batファイルの最終行にdelコマンド追加して今回作ったファイルを削除しようとしたが、batは削除できなかった。
batを閉じないと削除できない仕組みなのだろう。007みたく読まれると自己消去する実行ファイルを作るのは難しい?
次の課題として
・Pythonスクリプトを書き換えて、dirの右側に載っているフォルダとファイルの一覧を文字列操作で取り出しprintするようにすればシェルコマンド「ls」もどき(オプションなし)が作れる。
・今回作ったファイルのどちらか一つでも保存先を変えるか、カレントディレクトリを別の所から実行しても
batの保存場所変更 → Windows「操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
pyの保存場所変更 → Python「python: can't open file 'read_dir_stdout.py': [Errno 2] No such file or directory」
カレントディレクトリ変更 → Python「python: can't open file 'read_dir_stdout.py': [Errno 2] No such file or directory」
と言われて上手く行かないのですが、どこに保存しても動くように改良する。
- batファイルのパスを通す
- ファイルの読み書きをする際のファイルをパスも指定して書く
- またはコマンドで目的のファイルを検索できるようにしておく
などの手を打っておけば動くはず。
- もう少し短いブログを書くべき。
以上。