[英]Batch script: Pass returned GUID as URL parameter for desktop shortcut
我正在尝试为我们使用的私有页面创建桌面快捷方式,该页面将在 Edge 中打开,指向特定的 URL,并将 GUID 作为 URL 参数传递。
我尝试了以下方法,但正如您所料,只有字符串“powershell”被传递给 URL,而不是返回的 GUID。
SET a=powershell -Command "[guid]::NewGuid().ToString()"
C:\Windows\System32\cmd.exe /c start msedge "https://www.website.com/page?user="%a% --no-first-run
如何将 URL 的 %a% 部分替换为系统 GUID 的返回内容?
powershell -Command "[guid]::NewGuid().ToString()"
批处理文件(由cmd.exe
执行)在与 POSIX 兼容的 shell 中没有所谓的命令替换的概念(PowerShell 本身也提供了这一功能,尽管它在那里没有正式名称):分配命令的能力Z738E6221F398663到一个变量。
相反,您必须使用for /f
循环在变量中捕获命令 output (通常循环每个 output 行,但在您的情况下只有一个Z78E6221F6393D1356681DB398F4CE6DZ 行):
@echo off & setlocal
:: Capture the output from a PowerShell command in variable %guid%, via
:: a for /f loop:
for /f "usebackq delims=" %%a in (`powershell -Command "[guid]::NewGuid().ToString()"`) do set "guid=%%a"
:: Note: No need for `cmd /c` from a batch file to use `start`
start "" msedge "https://www.website.com/page?user=%guid%" --no-first-run
for /?
在cmd.exe
session 中寻求帮助。
这个答案更详细地讨论了使用for /f
来捕获命令 output ; 尤其:
usebackq
在这里并不是绝对必要的,但通常建议您可以自由地在被调用的命令行中同时使用'
和"
引用。
同样, delims=
在这里不是绝对必要的,因为 output 根据定义不包含空格,但如果意图是完整地捕获 output 行,通常是可取的。
作为第一个start
参数的""
在这里并不是绝对必要的,但通常在调用路径必须双引号的应用程序时它很有用。 如果没有""
作为第一个参数,双引号应用程序路径将被解释为starts
窗口标题参数(仅有意义地适用于控制台应用程序)。
可以使用 PowerShell 单线直接完成所有这些操作:
powershell -noprofile -command start msedge \"https://www.website.com/page?user=$(New-Guid) --no-first-run\"
-noprofile
传递给powershell.exe
在大多数情况下是减少启动时间并提供更可预测的环境的好主意,因为不会加载任何用户配置文件。start
是Start-Process
命令的别名。start
传递了两个位置 arguments,要启动的进程的名称( -FilePath
参数)和进程的 arguments 作为单个字符串( -ArgumentList
参数)。 因此,必须引用第二个参数。 要将命令处理器cmd.exe
中的引号传递到 PowerShell,它们必须进行反斜杠转义。$(…)
用于内联调用New-Guid
命令并将其转换为字符串(通过隐式调用它返回的Guid
object 的.ToString()
方法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.