Python 与Unix相当的Powershell脚本;“壳函数”;

Python 与Unix相当的Powershell脚本;“壳函数”;,python,windows,powershell,batch-file,Python,Windows,Powershell,Batch File,这基本上是的副本,只是我在windows上,希望能够从powershell脚本更改我的命令行目录 实际上,我正在从powershell文件运行一个python脚本,解析该python脚本的输出目录,然后将该输出用作要更改的目录,因此,如果有办法从python脚本而不是powershell文件中执行此操作,请额外加分 100%清楚地说,是的,我知道“cd”和“os.chdir”,不,这不是我想要的-这只是更改脚本或批处理文件的当前目录,而不是您运行的命令行 代码如下(批处理文件是我第一次尝试,我希

这基本上是的副本,只是我在windows上,希望能够从powershell脚本更改我的命令行目录

实际上,我正在从powershell文件运行一个python脚本,解析该python脚本的输出目录,然后将该输出用作要更改的目录,因此,如果有办法从python脚本而不是powershell文件中执行此操作,请额外加分

100%清楚地说,是的,我知道“cd”和“os.chdir”,不,这不是我想要的-这只是更改脚本或批处理文件的当前目录,而不是您运行的命令行

代码如下(批处理文件是我第一次尝试,我希望它是PS1脚本):

sw.bat-父目录添加到sys$PATH

@echo off
set _PY_CMD_="python C:\code\switch\switch.py %*"
for /f "tokens=*" %%f in ('%_PY_CMD_%') do (
    cd /d %%f
)
switch.py

导入操作系统
导入argparse
LOCAL=r'C:\code\LOCAL'
def parse_args():
parser=argparse.ArgumentParser(description='Workspace manager tool'。)
parser.add_参数('command',type=str,help='要执行的命令,或要切换到的工作区!')
返回parser.parse_args()
def execute_命令(命令):
如果命令位于['l','local']:
印刷品(本地)
def main():
args=parse_args()
执行_命令(args.command)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

试试Python中的
os.chdir

os.chdir(路径)


如果我没有弄错你的问题,一个简单的方法就是使用

script.py:

target\u dir=r“C:\Program Files”
打印(目标目录)
script.bat:

@echo关闭
设置“script.PY”\u PY\u CMD=“e:\Work\Dev\VEnvs\PY\u 064\u 03.07.03\u test0\Scripts\python.exe”
对于/f“tokens=*”%%f in('%\u PY\u CMD%')do(
pushd“%%f”
)
输出

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057062514]>ver
Microsoft Windows[版本10.0.18362.239]
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057062514]>script.bat
[cfati@CFATI-5510-0:C:\Program Files]>
[cfati@CFATI-5510-0:C:\Program Files]>popd
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057062514]>
注释

  • 我使用pushd(而不是cd),因为简单的popd将返回到原始目录。缺点是,为了匹配相应的POPD,必须记住(堆栈)调用pushd的次数。如果要切换到cd,请像这样使用:
    cd/d%%f
@EDIT0

起初,该问题仅适用于批处理,之后添加了PowerShell(PS)要求(可以作为不同的问题)
不管怎样,这里有一个简单的(虚拟)脚本可以实现这个技巧(我不是PS专家)

script.ps1:

$PyCmdOutput=&e:\Work\Dev\VEnvs\py\u 064\u 03.07.03\u test0\Scripts\python.exe''script.py'
设置位置$PyCmdOutput
输出

PS E:\Work\Dev\StackOverflow\q057062514>\script.ps1
PS C:\Program Files>

如果您想批量更改目录,我会这样做:

创建从中调用Python的批处理文件的主目录变量。
设置homeDir=%cd%

然后使用cd进入所需的目录。程序进入目录后,使用
start“Title here(可选)”cmd.exe创建新的命令提示符

最后,使用返回主目录 cd“%homeDir%”

脚本可能如下所示:

@echo off
REM using cd with no arguments returns the current directory path

SET homeDir=%cd%
REM set home Directory

cd "%desiredDirectory%"
REM moved directory

start "thisIsAName" cmd.exe
REM created new "shell" if you will

cd "%homeDir%"
REM returned to home directory
pause

在CristiFati的帮助下,我在批处理文件中实现了这一点。该解决方案已张贴在问题中。通过谷歌搜索,我将批处理文件解决方案转换为Powershell脚本解决方案,如下所示:

$command=“&python C:\code\switch\switch.py$args”
调用表达式$command | Tee对象-变量out | out Null
设置位置$out
不需要对Python文件进行任何更改。
注意-这个答案是为那些希望在调用python脚本时接受python脚本的任意数量的参数并抑制stdout的人提供的

请添加相关代码:。每次启动一个新的cmd实例都会产生很多我不愿意处理的问题(如保存历史记录)。这是一个工作区管理工具,用于提高我的工作流程速度。谢谢你!我不知道这对你有什么作用-我在我的bat文件中使用了“if defined\u target\u dir pushd%\u target\u dir%”,它不会改变我的目录。我使用echo进行了测试,但目录不同(并且正确)。我还测试了你的解决方案,我的命令行目录没有改变。我两次考试都通过了%*。该程序是“sw.bat”,因此在添加到我的路径后,我将其称为“sw l”,其中l参数指定C:/code/local。您将这两段代码保存在两个文件中(yoy应该编辑的唯一内容是Python可执行文件的路径),然后运行它们,但它们不起作用?你肯定做错了什么。它可以在我的机器上正常工作(我复制/粘贴)输出。您应该从这里开始,并且只有在它工作之后,才能为.bat文件增加复杂性。你也应该在问题中发表你的尝试。你抓住了我,我遗漏了一个重要的细节。我使用的是PowerShell,而不是cmd行,并且希望它也能从中工作。您的示例和我自己的代码都在标准cmd行中工作。如果它不能同时在这两种环境下工作,我宁愿让它在PowerShell中工作。正如问题中所述,我知道这是存在的,但它不工作。我试图更改cmd行目录,而不是python当前的工作目录。您最初未经编辑的问题提到了
os.cwd
而不是
os.chdir
。这就是我建议使用该函数的原因。
@echo off
REM using cd with no arguments returns the current directory path

SET homeDir=%cd%
REM set home Directory

cd "%desiredDirectory%"
REM moved directory

start "thisIsAName" cmd.exe
REM created new "shell" if you will

cd "%homeDir%"
REM returned to home directory
pause