Hướng dẫn run python script from powershell with arguments - chạy tập lệnh python từ powershell với các đối số

Tôi đang cố gắng gọi một tập lệnh Python chấp nhận các đối số để sao lưu cơ sở dữ liệu PostgreSQL trong VMware.

Mã như thế này:

# path to where you want to save the backup to
$filepath = "D:\pgbackups\"

# filename you want to call the backup
$filename = "torwpinf002_postgresdb_bk_"

# format the date/time so you can append to the backup filename
$filedate = get-date -Format "yyyyMMdd_HHmm"

# pack it all together 
$fullFileSave = $filepath + $filename + $filedate.ToString[] + ".bak"

$BackupScriptFile = "C:\backup_win.py"

$executebackup = "`"$BackupScriptFile`"" + ' -p  "QX+qos5eu1D36&kB" -f ' + "`"$fullFileSave`""

python $executebackup

Nếu tôi ném điểm dừng, tôi có thể hiển thị biến $executebackup và nó sẽ hiển thị điều này:

"C:\backup_win.py " -p  "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"

Điều này ném lỗi:

python : usage: backup_win.py [-h] -p PASSWORD -f BACKUP_FILE
At C:\Program Files\VMware\vCenter Server\python\torwpinf002_pgbackup.ps1:39 char:1
+ python $executebackup
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: [usage: backup_w... -f BACKUP_FILE:String] [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

backup_win.py: error: argument -p is required

Điều buồn cười về điều này là, hộp tôi đang chạy cái này là Windows 2012 R2. Kịch bản tương tự này hoạt động hoàn hảo trên Windows 2008 R2.

Huh?

Chà, vì vậy tôi nghĩ những gì đang xảy ra là các trích dẫn kép trên lệnh tôi đang chuyển vào python.exe đang làm hỏng các tác phẩm, vì vậy tôi đã thay đổi nó một chút:

$executebackup = $BackupScriptFile + ' -p  "QX+qos5eu1D36&kB" -f ' + $fullFileSave

dẫn đến đầu ra của điều này nếu tôi lặp lại nó với màn hình [thông báo không có báo giá xung quanh đường dẫn tệp]:

C:\backup_win.py  -p  "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak

Nhưng điều đó trả về lỗi này:

python.exe : C:\Program Files\VMware\vCenter Server\python\python.exe: can't open file 'C:\backup_win.py  -p  QX+qos5eu1D36&kB -f 
D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050': [Errno 22] Invalid argument
At line:1 char:1
+ python.exe $executebackup
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: [C:\Program File...nvalid argument:String] [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Tôi thực sự bị mắc kẹt, tôi chắc chắn rằng điều đó đơn giản là các chuyên gia có thể điều chỉnh trong 5 giây .. Bộ não của tôi được nấu chín và tôi không chắc chắn nên thử gì tiếp theo. Phần làm tôi khó chịu nhất là nó hoạt động tốt trên Windows 2008 nhưng không phải vào năm 2012.

Đây là một cái gì đó thực sự buồn cười. Nếu tôi lấy đầu ra của $executebackup:

C:\backup_win.py  -p  "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1058.bak

Và dán nó vào bảng điều khiển PowerShell, nó hoạt động tốt.

PS C:\Users\Administrator> C:\backup_win.py  -p  "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1058.bak

Backup completed successfully.

Bất kỳ suy nghĩ về làm thế nào để có được điều này để thực thi từ trong kịch bản?

Mục đích của trang này là để chứng minh cách truyền các đối số cho các tập lệnh Python thông qua các tập lệnh PowerShell. Trong Terminal PowerShell, bạn có thể gõ chúng theo nghĩa đen. Nhưng trong các tập lệnh PowerShell, bạn phải sử dụng các biến. Tôi cung cấp các ví dụ về các đối số vị trí cũng như các tùy chọn bằng cách sử dụng Argparse [việc thực hiện các đối số từ khóa nội bộ của Python].

1. Đối số vị trí bằng cách sử dụng sys.argv trong mã Python

  • Trong lần đầu tiên, tôi sử dụng
    "C:\backup_win.py " -p  "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
    
    1 để phân tích đối số để biểu thị hành vi không mặc định
  • Ví dụ là từ một kịch bản tôi sử dụng để vá các lược đồ phân tích SnowPlow [công việc hàng ngày/câu chuyện khác nhau]-Trong các trường hợp cạnh, tôi đang vượt qua
    "C:\backup_win.py " -p  "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
    
    2 để xóa thực tế qua API
  • Chạy
    "C:\backup_win.py " -p  "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
    
    3 để thực hiện xóa hoặc
    "C:\backup_win.py " -p  "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
    
    4 cho bản vá mặc định
PowerShell WrapperPyThon Script sử dụng `` belete` arg được truyền qua PowerShell

2. Tùy chọn [đối số từ khóa] Sử dụng mô -đun ArgParse trong mã Python

  • Trong lần thứ hai, tôi đang sử dụng argparse với các tham số được đặt tên để phân tích các đối số
  • Không phải đó cũng là các tham số được đặt tên Argparse [
    "C:\backup_win.py " -p  "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
    
    5 và
    "C:\backup_win.py " -p  "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
    
    6] là một phần của biến
    "C:\backup_win.py " -p  "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
    
    7
  • USECase là kịch bản Python của tôi mà tôi cập nhật Hashicorp Consul từ PowerShell Terminal [công việc hàng ngày/câu chuyện khác nhau]
  • Để biết thêm về Argparse, hãy xem các đối số Python với mô -đun Argparse: Mẫu tôi sử dụng để viết kịch bản CLI
trình bao bọc PowerShell có các đối số được đặt tên cho khóa và giá trị được sửa đổi các đối số phân tích tập lệnh python với mô -đun argparse

Liên kết

  • //stackoverflow.com/a/33639147/11082684
  • Argparse-Trình phân tích cú pháp cho các tùy chọn dòng lệnh, đối số và lệnh phụ

Bài Viết Liên Quan

Chủ Đề