使用参数执行python

问题描述:

我试图调用一个接受参数的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.

有关如何从脚本内执行此操作的任何想法?

不要将您的命令行定义为字符串(除非您想在大多数情况下通过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