2016-04-12 16 views
1

1つのコマンドラインでローカルパスをUNCパスに変換します。これを行うにはCMD遅延評価(文字列置換)+ "&"を含む1行の複数のコマンド

、私は、コマンドライン引数としての私の%output%を渡し、\\%ComputerName%\c$と私のローカルパスでC:を交換して、"\\Server\Resources\FileReceiver.exe" "%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 . . . 

だから、これは動作しますが、私の特定のユースケースのために、私は連結する必要がコマンドを1つの実行可能な行に置き換えます。したがって、改行を&と私のProofOfConcept.cmdに置き換えると、次のようになります。

SET "output=C:\MyFile.txt" & CALL SET output=%%output:C:=\\%ComputerName%\c$%% & "\\Server\Resources\FileReceiver.exe" "%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ファイルに2行目を追加すると、echo %output%という値が得られますが、最初の行では評価されません。私は怠惰な評価+スレッディングに関する何かを推測していますが、解決する方法がわかりません。最初の実行行全体を文字列で置換してから、それを呼び出す必要がありますか?

答えて

1

あなたは怠惰な評価について正しいです。最後のコマンドを別のCALLに置くことができます:

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

これは私のために働いています。

EDIT:最後のCALL( "%% output %%")の倍数に注意してください。これは、%が%出力%としてCALLコンテキストに渡されるためにパーセントがエスケープされなければならないため、重要です。これを指摘する良い呼び出し、@epicTurkey。ありがとう!

+1

感謝します!コマンドのCALLを実行すると、%output%を%% output %%に置き換えたコードが表示されます。これは、怠惰なパーサに必要です。他の人の答えを指摘するうえで参考になるかもしれません。 – TaterJuice

関連する問題