使用参数执行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-Expression
,which 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
那方式会工作,但问题是我必须动态地建立命令,所以路径必须放入字符串..当我建立的字符串与正确的值它炸弹..(几乎就像它不能鳍python.exe或.py脚本),但从控制台中的命令行它没有问题.. – user6594922
好的,这是奇怪的..你的方式工作..我刚刚取代了这样的动态路径和文件名var $ PARAMS = $ backupscriptFile, '-p', “QX + qos5eu1D36与KB”, '-f',$ fullfileSave &python.exe @params 和它的工作就像一个魅力。现在真正让我疯狂的是,为什么我之前编写的脚本在2008年的作品中没有和问题,但我必须像上面那样更改它以在Windows 2012上运行...该死的你窗户! – user6594922
因此,让我问你,我是否应该在2008盒子上以相同的方式运行脚本?我的意思是,在PowerShell中运行命令的首选方式是? (标准化编码) – user6594922