使用简单的PowerShell脚本创建一个目录并共享它,使得所有人都有权限,并将其映射为共享网络驱动器。

3
我将尝试为一个非it人士朋友自动化一个简单但重复的任务。我是一名电视编辑,但对此有简单的了解,因此我很欣赏您的技能和知识。
在Windows PC上,使用PowerShell,我想要一个脚本(我真的想要一个GUI,但那只是梦想),来:
1. 创建一个新目录在特定的硬编码位置 - 检查是否存在同名目录等。
2. 新目录与所有人共享,具备完全读/写权限。
3. 将新目录映射为持久性驱动器,跳过光学媒体/读卡器驱动器的下一个可用驱动器号。
注:如上所述,在重新启动后,网络共享必须保持持久性。
研究表明对于第1点(但需要更多检查重复项等):
# PowerShell creates a folder
$Location = "X:\Clients\"
New-Item -Path $Location -Name "My_New_Folder" -ItemType "directory"
#Invoke-Item $Location

研究表明2的解决方案:

不知道从哪里开始

研究表明3的解决方案:

@echo off
setlocal

call :freedrive mydriveletter && goto :cont
echo ERROR: No free drive letter found.
goto :exit
:cont
echo Found drive letter: %mydriveletter%

goto :exit

rem Finds a free drive letter.
rem
rem Parameters:
rem     %1 = Output variable name.
rem
rem Example:
rem     call :freedrive mydriveletter && goto :cont
rem     echo ERROR: No free drive letter found.
rem     goto :EOF
rem     :cont
rem     echo Found drive letter: %mydriveletter%
:freedrive
setlocal EnableDelayedExpansion
set exitcode=0
set "output_var=%~1"
for %%i in (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do (
    set "drive=%%i:"
    rem If 'subst' fails, the drive letter is already in use.
    rem This way we can even detect optical drives that have a drive
    rem letter but no media in them, a case that goes undetected when
    rem using 'if exist'.
    subst !drive! %SystemDrive%\ >nul
    if !errorlevel! == 0 (
        subst !drive! /d >nul
        goto :freedrive0
    )
)
set exitcode=1
set drive=
:freedrive0
endlocal & set "%output_var%=%drive%" & exit /b %exitcode%

:exit
pause

刚刚注意到我建议使用“subst”来代替3,但我更喜欢“net use”,因为它可以在重启后保持持久性,除非有人能提出其他建议。谢谢。 - Ogriff
2个回答

1
  1. It's unnecessary. Just create the folder, if it already exists it will fail.

    Use the MD aka mkdir command in batch.

    md c:\somepath\somefolder
    

    This is faster as there is only one disk access and uses less system resources.

  2. You have both file/folder permissions and share permission.

    icacls c:\somepath\somefolder /grant everyone:F
    
    net share sharename=c:\somefolder /grant:everyone,FULL
    
  3. To map a drive

    But I'm puzzled - what good does a mapped drive do the user?

    net use * \\server\share\folder /persistant:yes
    

当然还有mkdir /?icacls /?net help sharenet help use等相关内容。


有一个脚本,在编辑“新文件夹名称”后运行,然后它会自动完成其余的操作将是非常好的。共享文件夹的原因是将其挂载到一个驱动器盘符上,以便我的朋友的视频编辑系统可以按作业获得独立的卷。该软件仅将媒体存储到每个卷上的自己位置,因此这是一个整洁的方式来保持事物井井有条,每个项目都有一个驱动器。谢谢。 - Ogriff
以上内容是否可以简化,使脚本自动获取新目录的名称并将其传递到后续阶段?我无法做到,但我可以看出它的逻辑。 - Ogriff
设置新文件夹 = c:\ somefolder,甚至可以使用 set / p newfolder = c:\ somefolder 然后使用 - mkdir%newfolder%,请参见 set /?,您也可以键入 help 并查看大多数命令列表。 - user5071892
我感觉我的原始请求并没有完全回答我的经验水平问题。虽然自学无疑是有益的,但会花费很长时间或以失败告终。我相信 $name = Read-Host 'What is your filer name?' 可能对我的原始帖子有用。 - Ogriff
好的,我正在进展中 # PowerShell创建文件夹 $folder = Read-Host '在此处输入您的新目录名称' $Location = "C:\Clients" New-Item -Path $Location -Name "$folder" -ItemType "directory" #Invoke-Item $Location ......那么在icacls c:\somepath\somefolder /grant everyone:F中添加$Location和$folder以设置路径的正确方法是什么?net share sharename=c:\somefolder /grant:everyone,FULL - Ogriff

0

所以我认为我已经解决了自己的问题,语法对于新手来说很容易混淆,无法传递变量...

# create a folder with user input
$folder = Read-Host 'Name a new directory to be created in the Clients folder'
$Location = "C:\Clients\"
New-Item -Path $Location -Name "$folder" -ItemType "directory"
# set permission
icacls "$Location$folder" /grant everyone:F
# share folder
net share $folder="$Location$folder" /GRANT:EVERYONE`,FULL
# map folder as drive
net use * /persistent:yes \\localhost\$folder 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接