2016-11-12 2 views
0

このスクリプトを動作させる方法を教えてください。ディスククリーン用ディスクデフラグとディスクのPythonスクリプトを使用したクリーンアップ

デフラグ

については

import os; 
defragmentation=os.popen('defrag.exe /C').read() 
print(defragmentation); 

アップ

import os; 
clean=os.popen('cleanmgr.exe /sagerun:1').read() 
print(clean); 

このスクリプトをしようとしたら、それは何もしていないエラーメッセージプロンプトを行うdidntの。ありがとうございました。

+1

を推奨されていませんあなたは期待している? – spectras

+0

あなたはこれらのスクリプトを書いていましたか? –

+0

@spectras - バックグラウンドでディスクデフラグとディスククリーンアップを実行する必要があります。 – user2926827

答えて

1
  • あなたdefrag.execleanmgr.exeがあなたのpathにない場合、彼らは実行されません、あなたはあなたがそれらを動作させるために、管理者としてスクリプトを実行する必要がありますエラーメッセージ
  • を取得することはできません。
  • あなたは、あなたの実行ファイルの正しい完全なパスを検索したい場合は、次のスクリプトを使用することができます

のPythonにセミコロンを使用して行を終了する必要はありません。

paths = os.getenv('path').split(';') 
path_defrag = '' 

for p in paths: 
    if os.access(os.path.join(p, 'defrag.exe'), os.X_OK): 
     path_defrag = os.path.join(p, 'defrag.exe') 
     break 
if not path_defrag: 
    print('defrag.exe is not in your path or cannot be executed') 
  • 私はそれが来ていないすべてがまた
  • を終了すると、私はPythonがここにやり過ぎだと思いながら、簡単なバッチファイルは、仕事をするSpectrasのアイデアを提案し、出力を読んだ
+0

'>>> os.popen( 'foobar')'は 'sh:1:foobar:not found'を返します。ウィンドウについてはわかりませんが、Ubuntuではエラーメッセージがstderrに確実に書き込まれます。 – spectras

+0

@spectras:ここではWindowsとUbuntuが異なっています。 Windowsでは、プログラムが見つからない場合は空の文字列を返します。 –

+0

imはWindowsで動作しています。 – user2926827

0

私のコメントに基づいてビルド:私のここでの賭けは、スクリプトは完璧ですが、あなたはすぐに出力を見て、見ていない、プログラムを中止します。

ただし、read()はコマンドが完了するまでスクリプトを停止します。そして、それからだけ、pringintが起こります。したがって、コマンドが完了するまで、出力は表示されません。

私はこのようにそれを変更します

with os.popen('cleanmgr.exe /sagerun:1') as fd: 
    chunks = iter(lambda: fd.read(1), '') 
    for chunk in chunks: 
     sys.stdout.write(chunk) 

それが行くように印刷しているのアイデア:サイズが指定されている場合、readはループが記述子がクローズされなくなるまで、それはすぐにそれが読みとして返します。何か。

charsを1つずつ読み込むので、ここで最も効率的ではありません。実行しているプログラムについてはそれほど重要ではないでしょうし、Pythonでバッファリングの遅延を導入せずにもっと読むことは複雑です。

あなたはあなたのプログラムに出力を使用し、それが通過したい、多分あなただけ呼び出したほうが良いと思いますされていない場合は、次の追加のパラメータなしで

import subprocess 
subprocess.check_call(['cleanmgr.exe', '/sagerun:1']) 

を、出力はちょうどあなたに行きますスクリプトの出力。この関数は、コマンドが完了するまで待ってから戻ります。

+1

@ user2926827>私は[を使用して追加した提案を参照してくださいところで、実際にスクリプト内に出力が必要ない場合は、はるかに簡単です。 – spectras

+0

スクリプトを編集していただきありがとうございます。ただし、ディスクのクリーンアップが完了したら、ユーザー画面に完了通知が表示されるというコードを追加できますか? – user2926827

+0

'check_call'が返った後に、あなたが望むものを印刷してください。しかし、あなたの問題は[ウィンドウがすぐに閉じる](http://stackoverflow.com/questions/1000900/how-to-keep-a-python-script-output-window-open)ですか? – spectras

0

問題は、32ビットプロセスから64ビットの実行可能ファイルを起動しようとしているためです。 スクリプトを起動するpythonまたはcmdプロンプトが32ビットの場合、完全パスなしでdefrag.exeだけを指定すると、32ビットモードでdefrag.exeが起動します。

cleanmgrは何も返しません。空の文字列を戻すだけです。以下 てみコード、それはpythonの32ビットまたは64ビットのターゲットの64ビットOSの両方

import os 
print('running disk defragmentation, this might take some time ...') 
# you might wanna try out with %systemroot%\sysnative\defrag.exe /A first, 
# Else, it might really take some time for defragmentation 
if sys.maxsize > 2**32: 
    defragmentation=os.popen('defrag.exe /C').read() # run from 64-bit   
else: 
    defragmentation=os.popen(r'%systemroot%\sysnative\defrag.exe /C').read() # run from 32-bit 

print(defragmentation) 


print('running disk cleanup, this might take some time ...') 
clean=os.popen('cleanmgr.exe /sagerun:1').read() # should works in both 32-bit and 64-bit 
print(clean) # cleanmgr run from gui and don't return anything, this should be empty 

ための作品ではなく、サブプロセスを使用することを提案する必要があり、os.popenは正確に何

import sys 
import subprocess 

if sys.maxsize > 2**32: 
    run_cmd = 'defrag /C' # 64-bit python/cmd 
else: 
    run_cmd = r'%systemroot%\sysnative\defrag /C' # 32-bit python/cmd 

output, err = subprocess.Popen(run_cmd, stdout=subprocess.PIPE, shell=True).communicate() 
print(output) 
if err: 
    print('process fail, error {}'.format(err)) 
else: 
    print('process sucess') 

# repeat with run_cmd = 'cleanmgr /sagerun:1' 
+0

。私はエラーが発生したときにそれを試して、あなたの投稿を維持します。コード実行時に – user2926827

+0

「システムは指定されたパスを見つけることができません」というエラーが表示されます。 " – user2926827

+0

python 64ビットで既に実行しているので、Python 32と64ビットの両方で動作するはずの更新されたコードを確認してください。 – Skycc

関連する問題