よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【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ファイル pwd.bat】コマンド自動実行化用。
  • Pythonスクリプト read_dir_stdout.py】dirコマンドから書き出したファイルの加工用。
  • 【(自動作成)テキストファイル dir_stdout.txt】コマンド「dir」の標準出力結果を書き出したファイル。

【おおまかな手順】


batファイルを実行
→ dirコマンドをファイルに書出
→ それをPythonで読み取り加工しprint
コマンドプロンプトに出力

  1. ファイルは全てデスクトップに作ります。動きが見える事と環境変数の設定などをせずに済むようにです。
  2. カレントディレクトリもデスクトップで行います。
  3. 【batファイル pwd.bat】を作り、dosコマンド「dir」標準出力の4行目に出る「 C:\Users\ユーザー名\Desktop のディレクトリ」を行数指定で取り出し加工したものを出力できるようにします。
  4. その際繰り返しになりますが、全てをbatファイルにスクリプトで書けばもっと簡潔にできるかもしれませんが
    • 一旦「dir」コマンド標準出力を【(自動作成)テキストファイル dir_stdout.txt】に書き出す。
    • 【batによる(自動作成)テキストファイル dir_stdout.txt】を【Pythonスクリプト read_dir_stdout.py】実行で読み取って4行目だけ取り出した上に不要な文字列を削除する。
  5. そしてこの2つを【batファイル pwd.bat】で実行します。

【作成】

1. 作成準備

1.1 コマンドプロンプト起動

コマンドプロンプトを起動します。

キーボードのWindowsキーを押してそのまま「cmd」「コマンドプロンプト」等と入力する。
入力途中(cかkを入力した段階で既に)に「最も一致する検索結果」に「コマンドプロンプト」と出ていればそのままEnterキーを押せば起動できます。

その他
Windowsキー+R 「ファイル名を指定して実行」で「cmd」入力後にEnterキーで起動。
マウスでスタートメニュー「windowsシステムツール」から「コマンドプロンプト」をクリックで起動。

【メモ】
コマンドプロンプトやターミナル操作ではキーボードの上下カーソルキーで入力履歴が出てくる。
何度も同じ入力をタイピングする手間が省略できる。


1.2 カレントディレクトリをデスクトップに移動

ファイルが作られる様を目視ですぐ確認できるのと、パスの設定をせずに済ませたい2つの理由で、カレントディレクトリをデスクトップにし、ファイルの保存もデスクトップにします。



では、起動したコマンドプロンプトでカレントディレクトリを移動します。

「cd Desktop」と打ちEnterキー

C:Users\ユーザー名 >cd Desktop

または全部小文字でも
 
C:Users\ユーザー名 >cd desktop

カレントディレクトリの表示が「C:Users\ユーザー名」から「C:Users\ユーザー名\Desktop」に変わっていればOK。


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スクリプトを使って取り出します。
そして「のディレクトリ」と不要な「スペース」を削除します。



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


目的の結果が得られました。pythonスクリプトは完成。


次ではbatファイルで作ります。


3. batの作成

ファイルの作成はこれで最後。
バッチファイルを作っていきます。

3.1 batファイル作成時の注意点

  • batファイルを作るのはテキストエディタならメモ帳でも何ででもOK。
  • ファイル名に拡張子「bat」をつけて保存すればバッチファイルになる。
  • batファイルのアイコンは歯車の2つついたもの。
  • 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ファイル実行

実行して目的の結果が得られたら今回は完了。

作ったものを確認。

デスクトップに以下の2つのファイル

  • read_dir_stdout.py
  • pwd.bat
実行方法の確認。
得たい結果はこれを出すこと。
C:\Users\ユーザー名\Desktop

batファイルの実行によって得られた結果である点で先ほどと異なっています。結果は同じ。

完成品の実行

>pwd


目的の実行結果と同じものが出たでしょうか。


5. まとめ他

ジミ過ぎる結果に誰得な感じでした。

発展的にちょっといじって、batファイルの最終行にdelコマンド追加して今回作ったファイルを削除しようとしたが、batは削除できなかった。
batを閉じないと削除できない仕組みなのだろう。007みたく読まれると自己消去する実行ファイルを作るのは難しい?


次の課題として
Pythonスクリプトを書き換えて、dirの右側に載っているフォルダとファイルの一覧を文字列操作で取り出しprintするようにすればシェルコマンド「ls」もどき(オプションなし)が作れる。

・今回作ったファイルのどちらか一つでも保存先を変えるか、カレントディレクトリを別の所から実行しても
batの保存場所変更 → Windows「操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
pyの保存場所変更 → Pythonpython: can't open file 'read_dir_stdout.py': [Errno 2] No such file or directory」
カレントディレクトリ変更 → Pythonpython: can't open file 'read_dir_stdout.py': [Errno 2] No such file or directory」
と言われて上手く行かないのですが、どこに保存しても動くように改良する。

  • batファイルのパスを通す
  • ファイルの読み書きをする際のファイルをパスも指定して書く
  • またはコマンドで目的のファイルを検索できるようにしておく

などの手を打っておけば動くはず。

  • もう少し短いブログを書くべき。

以上。