CMD懒惰评估(字符串替换)+单个行中的多个命令“&”

时间:2016-04-12 23:40:34

标签: replace cmd

我想在单个命令行中将本地路径转换为UNC路径。

要执行此操作,我希望使用C:替换本地路径中的\\%ComputerName%\c$,然后使用"\\Server\Resources\FileReceiver.exe" "%output%"调用我的网络资源,并将%output%作为命令行参数。

我有一个工作的ProofOfConcept.cmd文件,如下所示:

SET "output=C:\MyFile.txt"
CALL SET output=%%output:C:=\\%ComputerName%\c$%%
"\\Server\Resources\FileReceiver.exe" "%output%"
pause

和输出:

C:\>SET "output=C:\MyFile.txt"
C:\>CALL SET output=%output:C:=\\%ComputerName%\c$%
C:\>"\\Server\Resources\FileReceiver.exe" "\\PC-01\c$\MyFile.txt"
FileReceiver Util v1.0.3.94365

accepting \\PC-01\c$\MyFile.txt...

FileReceiver.exe exited on Server exited with error code 0.
C:\>pause
Press any key to continue . . .

所以这是有效的,但对于我的特定用例,我需要将命令连接到一个可执行行,所以我用&替换换行符,我的ProofOfConcept.cmd现在看起来像这样:

SET "output=C:\MyFile.txt" & CALL SET output=%%output:C:=\\%ComputerName%\c$%% & "\\Server\Resources\FileReceiver.exe" "%output%"

但是%output%现在是空字符串(“”)而不是格式化路径:

C:\>SET "output=C:\MyFile.txt"   & CALL SET output=%output:C:=\\%ComputerName%\c$%   & "\\Server\Resources\FileReceiver.exe" ""   & pause
Press any key to continue . . 

我做错了什么?如果我在.cmd文件echo %output%中添加第二行,我会得到一个值,但它不会在第一行进行评估。我猜测懒惰评估+线程,但我不知道如何解决。我是否需要将整个执行行首先替换为字符串,然后调用它?

1 个答案:

答案 0 :(得分:1)

你对懒惰的评价是正确的。您可以将最后一个命令放在另一个CALL中:

SET "output=C:\MyFile.txt" & CALL SET output=%%output:C:=\\%ComputerName%\c$%% & CALL "\\Server\Resources\FileReceiver.exe" "%%output%%"

这适合我。

编辑:注意最后一次CALL中的双倍百分比(" %%输出%%")。这很重要,因为百分比必须被逃脱。作为"%输出%"传递到CALL上下文。好的电话指出这个,@ epicTurkey。谢谢!