0

Windows で長いファイル名を持つコマンド ライン引数を取り、それを関数に渡すことに問題がありました。

つまり、スペースを含む長いファイル名は別々の部分に分割されます。

コマンド ライン全体を表示するために少しごちゃごちゃしたコードを作成しましたが、複数のパラメーターに対しては機能しますが、スペースを含む LFN に対しては機能しないため、理想とはほど遠いものです。(クラッジは別のスクリプト用に作成されたもので、これをコピーしただけです)他の誰かが確かにこれを解決したので、これを理解しようとしてGoogleで何時間も検索しました。ArgParse を使用してみましたが、分割せずにファイル名を取得することはできませんでした。

コマンドラインをそのまま(スクリプト名を除いて)取得し、完全なファイル名を取得することを示すコードを誰かが私に示すのに十分でしょうか。

ありがとう、アダム

[編集..]引用符で囲んでみましたが、それでも失敗しました。コードのテストから、入力がスペースで分割され、引用符が削除されることがわかりました。別のテストの例:

test.py コード:

import sys

print ('Number of arguments:', len(sys.argv), 'arguments.')
print ('Argument List:', str(sys.argv))
for x in range(0, len(sys.argv)):
    print("->" + sys.argv[x])

出力:

H:\bin>test "test lfn.txt" 
Number of arguments: 3 arguments. 
Argument List: ['H:\\bin\\test.py', ' test', 'lfn.txt']
->H:\bin\test.py
-> test
->lfn.txt

#

[編集2] 二重引用符が機能するため、Python on Windows のバグだと思います。

H:\bin>test ""test lfn.txt""
Number of arguments: 2 arguments.
Argument List: ['H:\\bin\\test.py', ' "test lfn.txt"']
->H:\bin\test.py
-> "test lfn.txt"

以下に投稿された元のコード。

###############################################################################
# Renames a single file to ISO date format: YYYYMMDD-HHMMSS                   #
###############################################################################

import datetime, os, sys

def error_filename():
    print("filename doesn't exist maybe.")
    sys.exit(1)

def error_args():
    print("Renames a single file to ISO date format: YYYYMMDD-HHMMSS")
    print("Requires 1 parameter, the filename to rename")
    sys.exit(2)

def error_rename():
    print("Unable to rename")
    sys.exit(3)

cmds = ""
for x in range(1, len(sys.argv)):
     cmds = cmds + sys.argv[x]
cmds = cmds.strip()
if cmds != "":
    d = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
    if os.path.isfile(cmds):
        fn = cmds.split(os.extsep)
        fn[0]=d
        newname = d + "." + fn[1] 
        print(cmds + " -> " + newname)
        try:
            os.rename(cmds, newname)
        except:
            error_rename()
    else:
        error_filename()

else:
    error_args()
4

1 に答える 1

0

私が抱えていたエラーは、以前は Windows 7 がエディターで Python ファイルを開くようにデフォルト設定されていたため、Python で開くようにレジストリで手動で変更したためです。別のマシンでクリーン インストールを実行し、python インストーラーにパスなどを設定させることで、問題なく動作しました。問題は、Windows レジストリ設定にあります。

于 2014-12-31T15:46:08.780 に答える