【问题标题】:Dynamically pass file name in .bat file script when calling Python script调用 Python 脚本时在 .bat 文件脚本中动态传递文件名
【发布时间】:2021-08-01 11:07:45
【问题描述】:

我有一个通过 .bat(批处理)文件调用的 python 脚本。为了使 Python 脚本正常工作,我在 .bat 文件中传递了硬编码的参数。但我需要动态传递参数,因为每次参数的值(名称)都会不同。

python 脚本的逻辑不受我的问题的影响,因为它可以正常工作。这里的问题是如何在 .bat 文件中动态传递此类参数,以便在同一个 .bat 文件中指定的 python 脚本将排除此类动态传递的参数。

sys.argv[1] 和 sys.argv[1] 是 python 文件中的参数(参见下面的代码),它们是硬编码并在 .bat 文件中传递的。但我需要动态传递参数(因为名称会不同)。

这是可以正常工作的 .bat 文件,因为参数是硬编码的。

python "E:\Export\Test.py" "E:\Config\Test_Upload_10-15-2020.csv" "./Test_Upload_10-15-2020.csv" "E:\BulkInsert_DataAcquisition\SAM\Log"

参数是完全限定的文件路径和文件名。 “E:\Export\Test_Upload_10-15-2020.csv”是 sys.argv[1] “Test_Upload_10-15-2020.csv”是 sys.argv[2]

所以我需要自动化它以允许处理以“Test_Upload_”开头的每个csv文件。

我试图用 .bat 中的“”符号替换日期戳(见下面的代码) python "E:\Export\TEST.py" "E:\Config\Test_Upload_.csv" "./Test_Upload_*.csv" "E:\logFolderPath"

但是执行这个 .bat 文件时出现错误

发生错误:[错误 123] 文件名、目录名或卷标语法不正确:'E:\Export\Test_Upload_*.csv'

它可以使用确切的文件名“Test_10-15-2020.csv”

只要我在参数中传递准确的 CVC 名称,下面的 Python 脚本就可以正常工作

import pysftp
import sys
import datetime

if __name__ == "__main__":
    localFilePath = sys.argv[1] #"\\MyDBServer\E:\Config\Test_Upload_%.csv" % name
    remoteFilePath = sys.argv[2] #"./Test_Upload_%.csv" % name.csv" 
    logFolderPath = sys.argv[3] #"E:\logFolderPath"


    myHostname = "SFTP.MyWebSite.com"
    myUsername = "MyLogin"
    myPassword = "MyPassword"

    try:
        with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword) as sftp:
            print ("Connection succesfully stablished ... ")
    
            sftp.put(localFilePath, remoteFilePath)
    
    except Exception as e:
        logfile = open(logFolderPath+"\Error_"+datetime.datetime.now().strftime("%Y%m%d_%H%M%S")+".log", "w")
        logfile.write("Error occured: "+ str(e))
        print(str(e))
        logfile.close
        sys.exit(1)

【问题讨论】:

  • 感谢您更新您的问题。不过,这似乎是一个简单的副本;如果您希望 Python 扩展通配符,则必须在代码中执行此操作,例如在 stackoverflow.com/questions/3348753/… 中,即使通配符字符串是从命令行而不是脚本中填充的。
  • 在我需要再次创建的重复问题中,因为这个问题已关闭,我已经得到了答案。感谢您的参与。 stackoverflow.com/questions/67513911/…

标签: python batch-file command-line-arguments windows-shell


【解决方案1】:

您可以搜索您的"E:\Export\Test_*.csv" 并获取最新或最旧的文件

paths = pathlib.Path('E:\Export).glob('Test_*.csv')
newest = max([path for path in paths], key=os.path.getctime)

oldest = min([path for path in paths], key=os.path.getctime)

【讨论】:

  • 目录中不会有任何最旧或最新的。我只需要在给定目录@Klim Bim 中处理所有名称中包含“Test_*.csv”的内容
  • @enigma6205:好的,minmax 不是必需的。但是,paths-表达式应该会有所帮助。
猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2021-12-10
相关资源
最近更新 更多