2

私は主に練習のために、この小さな .bat スクリプトを .py ファイルに書き直そうとしていますが、shutil モジュール全体をうまく動作させるのに苦労しています。コピーを使用するには多くの方法があるようです。削除およびディレクトリ作成。

しかし、私の主な希望は、誰かがこれらの基本的なコマンドを動作するスクリプトに変換できるようにすることです。そのため、他のスクリプトで作業している間に何かを始めることができ、最終的には使用を通じて理解できなくなることを願っています.

どんな助けでも素晴らしいでしょう!:)

        SET USERNAME

:: Create new directory
md "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data"   

COPY "Data" "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data"
COPY "System32.lnk" "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"


start /d "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data" explorer.exe 
start /d "C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data" PnkBstrA.exe

起動の問題:

再投稿して申し訳ありませんが、スクリプトはスクリプトの最後にある両方のアプリケーションを起動できません。起動コマンドだけをスクリプトから取り出して、以下のような新しいスクリプトに入れます。最初のアプリが閉じられると、最初のアプリと次のアプリが起動します。

また、アプリを次々と起動するように設定されているため、同時に実行されないようです。

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")


subprocess.call(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

編集:また、この編集された起動ファイルを、正しく機能するために起動するはずの2つのプログラムを含むフォルダーに直接配置する必要があります。

Popen テスト:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")

subprocess.Popen(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

Edit'd-PathName:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")

subprocess.Popen(['explorer.exe', data_dir])
subprocess.call([r'C:\C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data\Data\PnkBstrA.exe'], cwd=data_dir)

Edit'd PathName CMD 読み出し:

C:\Users\Spanjer\Desktop>installtest2.py
Traceback (most recent call last):
  File "C:\Users\Spanjer\Desktop\installtest2.py", line 9, in <module>
    subprocess.call([r'C:\C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Sta
rt Menu\Programs\Data\Data\PnkBstrA.exe'], cwd=data_dir)
  File "C:\Python27\lib\subprocess.py", line 524, in call
    return Popen(*popenargs, **kwargs).wait()
  File "C:\Python27\lib\subprocess.py", line 711, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 948, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

C:\Users\Spanjer\Desktop>

FINAL スクリプト 100% 動作中:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")
dest_dir = os.path.join(data_dir, r'Data')
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

if os.path.exists(dest_dir):
    shutil.rmtree(dest_dir)

shutil.copytree(r"Data", dest_dir)
shutil.copy(r"System32.lnk", menu_dir)
subprocess.Popen([r'C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data\Data\explorer.exe'], cwd=data_dir)
subprocess.call([r'C:\Users\Spanjer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data\Data\PnkBstrA.exe'], cwd=data_dir)
4

1 に答える 1

2

次のコードを試してください:

import os
import shutil
import subprocess

data_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Data")
menu_dir = os.path.expandvars(r"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")
dest_dir = os.path.join(data_dir, r'Data')
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

if os.path.exists(dest_dir):
    shutil.rmtree(dest_dir)

shutil.copytree(r"Data", dest_dir)
shutil.copy(r"System32.lnk", menu_dir)
subprocess.call(['explorer.exe', data_dir])
subprocess.call(['PnkBstrA.exe'], cwd=data_dir)

os.path.expandvars

os.path.expandvars(パス)

環境変数を展開して引数を返します。$name または ${name} の形式の部分文字列は、環境変数 name の値に置き換えられます。不正な変数名と存在しない変数への参照は変更されません。

Windows では、$name と ${name} に加えて %name% 展開がサポートされています。

os.mkdir

os.mkdir(パス[, モード])

数値モード モードで path という名前のディレクトリを作成します。デフォルトのモードは 0777 (8 進数) です。一部のシステムでは、モードは無視されます。これが使用される場合、現在の umask 値が最初にマスクされます。ディレクトリが既に存在する場合、OSError が発生します。

shutil.copy

shutil.copy(src, dst)

ファイル src をファイルまたはディレクトリ dst にコピーします。dst がディレクトリの場合、指定されたディレクトリに src と同じベース名を持つファイルが作成 (または上書き) されます。許可ビットがコピーされます。src と dst は文字列として与えられるパス名です。

subprocess.call

*subprocess.call(args, , stdin=なし, stdout=なし, stderr=なし, shell=False)

args で記述されたコマンドを実行します。コマンドが完了するのを待ってから、returncode 属性を返します。

上に示した引数は、以下のよく使用される引数で説明する最も一般的なものにすぎません (したがって、省略された署名の表記法は少し奇妙です)。完全な関数シグネチャは、Popen コンストラクターのシグネチャと同じです。この関数は、提供されたすべての引数をそのインターフェイスに直接渡します。

于 2013-08-01T02:42:27.887 に答える