我想在单个命令行中将本地路径转换为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%
中添加第二行,我会得到一个值,但它不会在第一行进行评估。我猜测懒惰评估+线程,但我不知道如何解决。我是否需要将整个执行行首先替换为字符串,然后调用它?
答案 0 :(得分:1)
你对懒惰的评价是正确的。您可以将最后一个命令放在另一个CALL中:
SET "output=C:\MyFile.txt" & CALL SET output=%%output:C:=\\%ComputerName%\c$%% & CALL "\\Server\Resources\FileReceiver.exe" "%%output%%"
这适合我。
编辑:注意最后一次CALL中的双倍百分比(" %%输出%%")。这很重要,因为百分比必须被逃脱。作为"%输出%"传递到CALL上下文。好的电话指出这个,@ epicTurkey。谢谢!