В аргументах пакетного файла Win10: замена префиксов UNC Path Names на известные подключенные диски - PullRequest
0 голосов
/ 17 апреля 2019
  • Я работаю в общем диске на сервере.
  • Иногда люди используют его подключенный диск, Q:\Folder\Subfolder\Etc\
  • В других случаях люди используют его UNC-путь, \\server.com\shared data\Folder\Subfolder\Etc\

У меня есть пакетный файл, который принимаетАргумент путей файла (ов) (обычно нескольких файлов) сбрасывается на него.Затем он передает их в сценарий PowerShell.

Однако, когда кто-то удаляет файлы из папки, доступ к которой осуществляется по его UNC-пути, появляется barfs:

'\\server.com\shared data\Folder\Subfolder\Etc'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.

Как заменить \\server.com\shared data\ на Q:\ для каждого имени файла вАргумент?Мой сценарий PowerShell выполняет всю обработку, поэтому я хочу исправить ее до того, как она будет отправлена ​​в PowerShell.

Я могу запустить команду cls в начале начала пакета, чтобы убрать предупреждение,Я не могу изменить реестр для этого случая.

@echo off
Title Pass arguments from this Batch script to PowerShell script of same name
rem 
rem Batch Handler of Command Line Arguements for Microsoft Windows
rem  Enables Passing Command Line Arguements to PowerShell Script
rem   
rem The name of the script is drive path name of the Parameter %0
rem     (= the batch file) but with the extension ".ps1"
set PSScript=%~dpn0.ps1
set args=%1

:More
shift
if '%1'=='' goto Done
set args=%args%, %1
goto More
:Done
powershell.exe -NoExit -Command "& '%PSScript%' '%args%'"

Итак, я надеюсь, что есть способ не допустить, чтобы скрипт PowerShell .ps1 не видел \\server.com\shared data\, а просто позволил ему увидеть Q:\.

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Это то, чем я в итоге воспользовался: активировать отложенное расширение - это билет.

@echo off
setlocal enableDelayedExpansion
Title Pass arguments from Batch Script to PowerShell Script
rem The name of the script is drive path name of the Parameter %0
rem     (= the batch file) but with the extension ".ps1"
set "PSScript=%~dpn0.ps1"
set "args=%1"

:More
shift
if '%1'=='' goto Done
set "args=%args%, %1"
goto More
:Done

set "args=!args:\\server.com\shared data\=Q:\!"
powershell.exe -NoExit -Command "& '%PSScript%' '%args%'"
1 голос
/ 17 апреля 2019

Не могу попробовать прямо сейчас, но я думаю, вы можете попробовать один из них:

  • Получить имена всех аргументов и разобрать \ server.com \ в Q: \, вероятно, не лучшая идея, так как у каждого пользователя могут быть разные буквы
  • Если файлы находятся в том же каталоге, что и скрипт (или всегда в одной и той же исходной папке), попробуйте использовать pushd \\server.com\shared..., чтобы сопоставить каталог с временным модулем, а затем получите его с помощью cd для его использования. Когда вы закончите, удалите папку с помощью popd (это отобразит последний сопоставленный блок)
...