2016-04-01 4 views
0

ファイル内の文字列に基づいて名前を変更する必要があるファイルがたくさんあります。しかし、私はバッチファイル内でこれを行う必要があり、Windows Server(PowerShell V2)のネイティブなものを使用して行う必要があります。 名前をつけたい名前を残しておきたいPowershellから返されるバッチ変数NULL

通常のバッチでの検索/置換は多少弱いので、以下のPowershellコマンドを使用して目的のテキストを抽出していますが、 powershellによって返された文字列を保持する。

@ECHO ON 
SETLOCAL ENABLEDELAYEDEXPANSION 
for %%f in (*.pdf) do (
    FOR /F "usebackq delims=" %%v IN (`powershell -command "$match = (Get-Content %%~nf.txt) | select-string -pattern 'FOOTER '; $match -replace 'FOOTER ',''"`) DO set g=%%v 
    echo %g% 
) 

結果から、「g」が設定されていることがわかりますが、使用するときは空です。私はまた、gを "!"で囲んでみました。何か案は?

C:\TEMP>(
FOR /F "usebackq delims=" %v IN (`powershell -command "$match = (Get-Content A.txt) | select-string -pattern 'FOOTER '; $match -replace 'FOOTER ',''"`) DO set g=%v 
echo 
) 

C:\TEMP>set g=SOME OTHER FILE 
ECHO is on. 

C:\TEMP>(
FOR /F "usebackq delims=" %v IN (`powershell -command "$match = (Get-Content B.txt) | select-string -pattern 'FOOTER '; $match -replace 'FOOTER ',''"`) DO set g=%v 
echo 
) 

C:\TEMP>set g=SOME FILE NAME 
ECHO is on. 
+1

PowerShellに依存している場合は、なぜバッチを使用する必要がありますか? PowerShellですべてのことを行うだけではいかがですか。あなたの実装は非常に簡単で、あなたの特定の質問は単に消えます。 –

+0

バッチファイルには、ファイル比較プログラムやエラーレベルチェックなどの呼び出しがありますが、Powershellには依存しませんが、IMOは、通常のバッチで利用できるものより優れています(例:Findstr)。 Findstrを使ってFOOTER ABC XYZを見つけて、ABC XYZを返すだけで問題が解消されたら、それでも、なぜ変数がクリアされているのか不思議です。 – stackbacker

+0

「バッチファイル内で実行中の他の作業」は、PowerShellでも実行できます。 (結局のところシェルです)@RBと同意します。 PowerShellで再実装する必要があります。 –

答えて

1

問題が見つかりました。ドー!

"echo!g!"ではなく "echo%g%"を使用していました。

@ECHO ON 
SETLOCAL ENABLEDELAYEDEXPANSION 
mkdir final 
for %%f in (*.pdf) do (
    FOR /F "usebackq delims=" %%v IN (`powershell -command "$match = (Get-Content %%~nf.txt) | select-string -pattern 'FOOTER '; $match -replace 'FOOTER ',''"`) DO set g=%%v 
    echo !g! 
    rename %%~nf.txt "final/!g!.txt" 
    rename %%~nf.pdf "final/!g!.pdf" 
) 
関連する問題