2016-07-15 40 views
1

我試圖調用一個接受參數的Python腳本來備份VMware中的PostgreSQL數據庫。使用參數執行python

代碼是這樣的:

# 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 

如果我把一個斷點,我可以顯示變量$executebackup,它會顯示這樣的:

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

這引發錯誤:

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

有趣的是關於這個,我正在運行這個的盒子是Windows 2012 R2。這個SAME腳本在Windows 2008 R2上完美運行。

咦?

嘛,所以我認爲正在發生的事情是在我傳遞到python.exe該命令的雙引號被打亂的作品,所以我改變了一點:

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

導致的輸出這一點,如果我把它回顯到屏幕(注意周圍的文件路徑不包括引號):

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

但返回此錯誤:

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

我真的被卡住了,我相信這是簡單的,專家可以在5秒內調整..我的大腦已煮熟,我不知道接下來要嘗試什麼。最讓我感到迷惑的部分是,它在Windows 2008上運行良好,但在2012年沒有問題。

這是一件非常有趣的事情。如果我參加了$executebackup的輸出:

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

並將其粘貼到PowerShell控制檯它工作得很好。

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

Backup completed successfully.

有關如何從腳本內執行此操作的任何想法?

回答

1

不要將您的命令行定義爲字符串(除非您想在大多數情況下通過Invoke-Expressionwhich I wouldn't recommend運行它)。

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

如果你的參數有所不同,你可以把它們放在一個數組和splat它調用python.exe時:就像你在控制檯做簡單地使用call operator&),並把你的論點

$params = 'C:\backup_win.py', '-p', "QX+qos5eu1D36&kB", 
      '-f', 'D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1058.bak' 

& python.exe @params 
+0

那方式會工作,但問題是我必須動態地建立命令,所以路徑必須放入字符串..當我建立的字符串與正確的值它炸彈..(幾乎就像它不能鰭python.exe或.py腳本),但從控制檯中的命令行它沒有問題.. – user6594922

+0

好的,這是奇怪的..你的方式工作..我剛剛取代了這樣的動態路徑和文件名var $ PARAMS = $ backupscriptFile, '-p', 「QX + qos5eu1D36與KB」, '-f',$ fullfileSave &python.exe @params 和它的工作就像一個魅力。現在真正讓我瘋狂的是,爲什麼我之前編寫的腳本在2008年的作品中沒有和問題,但我必須像上面那樣更改它以在Windows 2012上運行...該死的你窗戶! – user6594922

+0

因此,讓我問你,我是否應該在2008盒子上以相同的方式運行腳本?我的意思是,在PowerShell中運行命令的首選方式是? (標準化編碼) – user6594922