17

ネットワーク ドライブをバッチ ファイルにマップする必要がありますが、ドライブ文字を指定したくありません。

バッチ ファイルは展開プロセスの一部として使用されます。からバッチ ファイルを呼び出します。バッチ ファイルはCruiseControl.Net、認証に資格情報を必要とする UNC パスをマップする必要があります。次に、バッチ ファイルはRoboCopy、Web サイトを出力ディレクトリから宛先に展開するように呼び出します (一部のファイルとフォルダーは除外されます)。最後に、バッチはネットワーク ドライブを削除します。

問題は、これはスケーラブルではないことです。少数のプロジェクトしかない場合は問題ありませんが、このアプローチを使用するプロジェクトが 20 になり、マップするドライブ文字が不足しています。ドライブ文字が衝突する可能性があるため、ドライブ文字を再利用したくありません。これは悪いことです。

これはバッチ ファイルの例です。

@echo off
net use x: \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd
robocopy.exe "W:\wwwroot\MyProject" x:\ *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP
net use x: /delete

読みやすいようにフォーマットされています。

@echo off
net use x: \\192.168.0.1\Share\wwwroot\MyProject 
    /user:mydomain\myuser MyP455w0rd
robocopy.exe "W:\wwwroot\MyProject" x:\ *.* /E /XO /XD 
    "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP
net use x: /delete
4

7 に答える 7

35

複数のネットワーク共有を同時に接続していない場合はnet use *、空きドライブ文字を割り当てることができます。その後、 を使用robocopyして UNC パス経由で共有にアクセスし、接続されている共有を で解放できますnet use * /delete

このようなもの:

@echo off
net use * \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd
robocopy.exe "W:\wwwroot\MyProject" "\\192.168.0.1\Share\wwwroot\MyProject" *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP
net use * /delete /yes

編集:

いくつかの調査からわかったように、ドライブ文字を割り当てずに共有をマップするだけで済みます。次に、リモート UNC パスによってのみ、匿名でマップされます。このようにして、リモート名のみを指定してマッピングを削除することもできます。

これはうまくいくはずです:

@echo off
net use \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd
robocopy.exe "W:\wwwroot\MyProject" "\\192.168.0.1\Share\wwwroot\MyProject" *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP
net use \\192.168.0.1\Share\wwwroot\MyProject /delete
于 2010-09-15T10:03:59.237 に答える
11

私はこれを使用してNETに空きドライブ文字を選択させ、次にNETを使用して割り当てられた文字を見つけます:

net use * \\server\share
for /f "tokens=2" %%i in ('net use ^| find "\\server\share"') do set netdrive=%%i
echo %netdrive% has been mapped
于 2012-01-25T14:19:39.407 に答える
2

わかりました...これは魅力的ではないかもしれませんが、これが私が今やっている方法です。基本的なトライ キャッチ アプローチ。ドライブをマップしてみて、使用中の場合は次の手順に進みます。これを 2 回だけ試してみましたが、4 つ、10 つ、またはそれ以上のドライブ文字に拡張することは難しくありません。

はい、それは私のプログラミングの感性を傷つけます。コードの繰り返しは好きではありません。残念ながら、パスと資格情報をバッチ ファイルに渡す方法がわかりません。CruiseControl.net はパラメーターなしでそれを呼び出します。

@echo off

:START
net use z: \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd
if %ERRORLEVEL% ==2 goto Y
ROBOCOPY HERE
net use z: /delete
exit

:Y
net use y: \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd
if %ERRORLEVEL% ==2 goto W
ROBOCOPY HERE
net use y: /delete
exit

:W
sleep 20
goto START
于 2010-09-15T12:08:52.777 に答える
1

最も簡単な方法:

pushd "\\server\share\wwwroot\My Project"
robocopy . x:\ *.* /E ...etc
popd

Pushdは自動的にネットワーク ドライブを使用可能な文字にマップし、popdはそれを削除します。これらは内部 CMD コマンドです。UNC パスを使用するには、拡張機能を有効にする必要があります。バッチの例:

@echo off
pushd %1
  echo. --- Processing %1 as "%cd%"
  echo. ...
  rem do thing here
  echo. Done.
popd

注: コマンド ライン引数を使用するこの実装では、コマンド ラインのパスを引用符で囲む必要があります。

サンプル セッション:

E:\temp>.\demo-pushd.bat "\\server\share\wwwroot\My Project"
 --- Processing "\\server\share\wwwroot\My Project" as "X:\wwwroot\My Project"
    ...
    Done.

E:\temp> net use X:
The network connection could not be found.

More help is available by typing NET HELPMSG 2250.
E:\temp>
于 2015-04-02T17:37:27.073 に答える
0

@longneck、私は次のようなものを使用します:

for /f "tokens=2" %%i in ('net use * \\server\share') do (
    if defined netdrive goto :cont
    set netdrive=%%i
)

:cont
echo.%netdrive% has been mapped
pause

net use %netdrive% /d /y
pause

これにより、find を介してパイプされた net への 2 回目の呼び出しが回避されます。

これを拡張して set netdrive を直接呼び出す代わりに、サブルーチンで実行することもできます。これにより、より多くのエラー チェックや処理を行うことができます。

for /f "tokens=2" %%i in ('net use * \\server\share') do (
    if defined netdrive goto :cont
    call :parse %%i
)

:parse
if ~%1==%1~ goto :eof
if Z:==%1 (
    set netdrive=%1
)
goto :eof

:cont
echo.%netdrive% has been mapped
pause

net use %netdrive% /d /y
pause

ここでの parse サブルーチンはあまり役に立たず、概念を説明するだけです。

于 2015-06-26T23:35:05.997 に答える