V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

请问 powershell(windows server 运维时)如何串行地顺序执行一个(脚本)文件里的命令?

  •  
  •   Newyorkcity · 2020-02-13 19:39:10 +08:00 · 2635 次点击
    这是一个创建于 1748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如

    npm install
    npm run build
    

    显然,要等待 第一条语句 npm install 执行完成 才继续执行第二条

    但是一个 .bat 文件,双击运行后 npm install 执行完成会导致窗口直接退出,第二条语句不执行。

    如果使用

    start npm install
    start npm run build
    

    则第一条命令打开一个 npm 窗口开始执行,就认为自己执行完了,然后开始执行下一条。但npm install其实还没整完。。

    谢谢

    14 条回复    2020-02-14 10:04:37 +08:00
    chenbojian
        1
    chenbojian  
       2020-02-13 19:45:52 +08:00
    为什么 powershell 的标题里还出现 bat,你是不是不知道什么是.ps1
    hljjhb
        2
    hljjhb  
       2020-02-13 19:53:48 +08:00 via Android
    powershell 大法好,摆脱 cmd 保平安
    classyk
        3
    classyk  
       2020-02-13 19:59:24 +08:00 via iPhone   ❤️ 1
    NPM 的问题,powershell 没怎么用过,批处理文件里用 call npm install 调用,也就是每个前面加一个 call
    imn1
        4
    imn1  
       2020-02-13 20:00:06 +08:00   ❤️ 1
    管道啊
    竖线 |
    自己搜搜 “powershell 管道符”
    Newyorkcity
        5
    Newyorkcity  
    OP
       2020-02-13 20:08:24 +08:00
    @chenbojian
    @hljjhb
    @classyk
    @imn1

    mvn clean package `
    `-DLOG_ROOT=C:\Users\Administrator\Documents\Scuwall\backendlog` `
    `-Dspring.profiles.active=prod`

    请问几位知道 ps1 中如何换行么?我网上一搜都是说用 反引号。。我就这么用的
    后面两行 -D 打头的要作为 mvn 命令的参数 我看网上的说法也要用反引号把它们转义
    我现在用这个样子的话最后那一行还是没有被视为 mvn 命令的参数,而是报错说 powershell 没有 `-Dspring.profiles.active=prod` 这样的命令

    谢谢
    imn1
        6
    imn1  
       2020-02-13 20:20:06 +08:00
    你这没有转义需求,那就不用转义啦,参数里面有特殊符号才需要转义,例如参数里面有双引号或者管道符之类
    Tumblr
        7
    Tumblr  
       2020-02-13 20:23:44 +08:00   ❤️ 1
    1. 你的问题描述和回复里没看到半点 PowerShell 的影子;
    2. PowerShell 的换行是 grave (重音符号,即 1 前面那个);
    3. PowerShell 本身就是顺序执行的脚本语言,如果启动某个程序,用 cmdlet `Start-Process`,加参数 -Wait 可以等待执行。
    Newyorkcity
        8
    Newyorkcity  
    OP
       2020-02-13 20:24:57 +08:00
    @imn1 额。。如果不转义的话报
    Unknown lifecycle phase ".profiles.active=prod"
    如果朋友你不是 java 开发的话。。这就相当于这条命令被这么理解:

    mvn clean package .profiles.active=prod .....

    哎。真的是让人头大,那么是要转义什么部分呢?
    Newyorkcity
        9
    Newyorkcity  
    OP
       2020-02-13 20:29:15 +08:00
    @Tumblr 谢谢解答。但 powershell 官网说它功能强大,所以学习起来也要更多投入,我现在不想深入这个。能麻烦您再解答一下我更新的问题么,在八楼。
    CallMeReznov
        10
    CallMeReznov  
       2020-02-13 20:35:33 +08:00   ❤️ 1
    mvn clean package `
    '-DLOG_ROOT=C:\Users\Administrator\Documents\Scuwall\backendlog`
    -Dspring.profiles.active=prod'
    feilong
        11
    feilong  
       2020-02-13 22:04:35 +08:00 via Android
    start 是个单独的命令,有参数设置等待的
    Newyorkcity
        12
    Newyorkcity  
    OP
       2020-02-13 22:51:29 +08:00
    @CallMeReznov 谢谢你的解答,可以再请教一下你是如何推断使用引号括住的范围的吗?

    比如我接下来要

    java -jar
    -DLOG_ROOT=C:\Users\Administrator\Documents\Scuwall\backendlog
    -Dspring.profiles.active=prod
    xxx.jar

    请问如何推断引号应该从那里括到那里呢? 是 引号开始 -jar .... xxx.jar 引号结束
    还是 -jar 引号开始 ...... 引号结束 xxx.jar

    虽然一个一个尝试过来总能试出来。。但其中的规则可以麻烦您讲一下么?
    CallMeReznov
        13
    CallMeReznov  
       2020-02-13 23:02:05 +08:00   ❤️ 1
    @Newyorkcity #11 这里引号为了转义,讲道理只要不出现特殊符号,命令行能识别,在没有特殊要求情况下带不带引号应该没区别的
    你全括起来与 一个参数括起来一段本质上执行起来没区别,你之前那段之所以错误是以为你` 和''是两码事
    Tumblr
        14
    Tumblr  
       2020-02-14 10:04:37 +08:00   ❤️ 1
    @Newyorkcity #7 那个……可能上面有回答者在我的 block list 里了,你的这一条回复我看到的是 7 楼,8 楼是 feilong 回答的「 start 是个单独的命令,有参数设置等待的」,上面有你提到的「那么要转义什么部分呢」应该是有上下文的,所以……我不知道该回答哪个。 😂
    单独说转义的话,PowerShell 里可以直接在需要转义的字符前添加`( grave )就可以了,比如:
    Start-Process -FilePath '/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app' -ArgumentList "--mode `"quiet`""

    P.S 上面的参数我是随便写的,实际上这个应用没有这个启动参数。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3869 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:28 · PVG 18:28 · LAX 02:28 · JFK 05:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.